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

 1.1 直接插入排序

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

一次排序思想如下:

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

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,后面的依次往前插入

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 ;
代码实现如下:

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;
            }
            }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值