数据结构-插入排序 希尔排序

1.1 直接插入排序

直接插入排序是一种简单的插入排序法,其基本思想是:把数组中未排序的部分依次插入到一个有序的序列中。那么数组的本质就是假设第一个有序,把后面的数依次插入到前面的有序序列中

一次排序思想如下:

假设0, end 区间是有序的,将end+1插入到前面

cpp 复制代码
void PrintArray(int* a, int n){
    int end;
    int tmp = a[end+1];
    while (end >= 0) {
        if(tmp < a[end]){
            a[end] = a[end+1];
        }
        else{
            break;
        }
        end--;
    }
    a[end+1] = tmp;//防止tmp是最小的数
    printf("\n");
}

数组排序思想:

假设第一个有序,那么第一个就是end,后面的依次往前插入

cpp 复制代码
void InsertSort(int* a, int n){
    for (int i = 0; i < n-1; i++) {
        int end = i;
        int tmp = a[end+1];
        while (end >= 0) {
            if(tmp < a[end]){
                a[end+1] = a[end];//不能是a[end] = a[end+1]
            }
            else{
                break;
            }
            end--;
        }
        a[end+1] = tmp;//防止tmp是最小的数+插入(本质是替换)
    }
}

1.2 希尔排序

希尔排序就是直接插入排序的升级版,它的主要思想如下:

  1. 进行预排序,使得目标数组接近有序,大的更快放到后面的位置,小的更快放到前面的位置

  2. 进行直接插入排序,完成最后的排序

预排序:

选择每间隔几个数据进行直接插入排序,设置gap的值

最终gap = 1;完成排序

希尔排序的gap问题:

一般取增量 gap = gap/2 ;

代码实现如下:

cpp 复制代码
void ShellSort(int* a, int n){
    int gap = n;
    while (gap > 1 ) {
        gap /= 2;//最后一个数gap一定等于1
        for (int h = 0; h < gap; h++) {//gap组进行预排序
            for (int i = 0; i < n-gap; i += gap) {//每一组排序
                int end = i;
                int tmp = a[end+gap];
                while (end >= 0) {
                    if(tmp < a[end]){
                        a[end+gap] = a[end];
                    }else{
                        break;
                    }
                    end -= gap;
                }
                a[end+gap] = tmp;
            }
            }
        }
    }
相关推荐
荆棘鸟智能14 分钟前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
淡海水44 分钟前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出时尚聚会中的“独特颜色“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
INGNIGHT4 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_839080544 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山5 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
暮雨封夕5 小时前
跳表(Skip List)详解:原理、实现、使用场景与实际应用
数据结构
mikuyyds5 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
a187927218315 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
miller-tsunami5 小时前
排序的相关知识点
数据结构·排序算法