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

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;
            }
            }
        }
    }
相关推荐
君义_noip14 小时前
信息学奥赛一本通 4017:【GESP2309三级】小杨的储蓄 | 洛谷 B3867 [GESP202309 三级] 小杨的储蓄
c++·算法·gesp·信息学奥赛
高山上有一只小老虎15 小时前
判断是否为数独数组
java·算法
宝贝儿好15 小时前
【强化学习】第二章:老虎机问题、ε-greedy算法、指数移动平均
人工智能·python·算法
CoovallyAIHub15 小时前
超越深度学习:量子优化如何通过算法与硬件重塑AI
深度学习·算法·计算机视觉
mit6.82415 小时前
模拟|str_dp
算法
前端小L15 小时前
回溯算法专题(九):棋盘上的巅峰对决——经典「N 皇后」问题
数据结构·算法
DR-ZF-15 小时前
20251210 线性最小二乘法迭代拟合(梯度下降)
算法·机器学习·最小二乘法
神仙别闹15 小时前
基于C++生成树思想的迷宫生成算法
开发语言·c++·算法
CoovallyAIHub15 小时前
南京理工大学联手百度、商汤科技等团队推出Artemis:用结构化视觉推理革新多模态感知
深度学习·算法·计算机视觉