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

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;
            }
            }
        }
    }
相关推荐
vivo互联网技术2 小时前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 小时前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050736 小时前
(一)小红的数组操作
算法·编程语言
怕浪猫9 小时前
Electron 系列文章封面图
算法·架构·前端框架
徐小夕11 小时前
JitWord 3.0 正式发布,高精度Word异构解析+复杂组件兼容,打造web端协同Word编辑器
前端·vue.js·算法
通信小呆呆1 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
benben0441 天前
强化学习之DQN算法族(基于gymnasium开发)
算法
小小工匠1 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾1 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器