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

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;
            }
            }
        }
    }
相关推荐
To_OC21 小时前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC21 小时前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK1 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
_清歌1 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局1 天前
SVD 的三步走:双对角化、Givens 收敛、排序
算法
躬行见万象1 天前
《VLA 系列》UniLab 强化训练 | G1 机器人 |复现
算法
统计实现局1 天前
对称不定分解(Bunch-Kaufman):为什么 Cholesky 不够用
算法
统计实现局1 天前
dqrsl 拆解:拿着 QR 结果能算出哪 5 种东西
算法
统计实现局1 天前
为什么 Cholesky 求逆比 Gauss-Jordan 快一倍——行列式溢出防护详
算法