插入排序&希尔排序—思路及实现

插入排序小结

插入排序是一个O(n2)级别的算法,按照常理来说在系统级别的排序中是不会去用到这么“慢”的算法,但是它有也个性质——对==近乎有序==的序列进行排序速度非常快。这个神奇的性质可以放在很多排序算法中进行优化!
其算法思想很简单:

step1. 默认第一个元素有序,其余的元素无序。
如图 橙色为有序部分。灰色为无序部分。
这里写图片描述
step2. 从无序的序列中,取第一个元素插入到有序的序列中合适的位置。直到遍历结束。

这里写图片描述
temp 等于红色的框框里面的值。在黄色的有序中找到合适的插入位置。

void insertSort(int *Array,int n){
    int temp;
    int j;
    for(int i=0;i<n;i++)
    {
        temp=Array[i];
        for(j=i;j>0;j--) //因为比较的是Array[j-1]与temp的值,所以不能等于0
        {
            if(Array[j-1]>temp)
            {
                Array[j]=Array[j-1];
            }//比temp大就往后移
            else
            {
                break;//刚好这里
            }
        }
        Array[j]=temp;//合适的位置插入进去即可
    }
}

无论是算法的实现,还是思路都很简单。
下面看看其性能。
在十万的随机数
insert Sort:8.3768
mergeSort:0.024668
两种排序速度,是不可比拟的。
但是在近乎有序的数组中就变得不一样了。

在测试案例中,用一个十万的案例,随机交换了10个数字的位置产生一个近乎有序的数组排序。
insert Sort:0.003656
mergeSort:0.017127
这里可以发现,直接插入排序的速度是非常快的。
那这个性质可以用在哪里呢?会用到高级排序算法(指的是时间复杂度为O(nlogn)的算法)等其接近有序的时候使用直接插入排序能达到一些优化,在后续的博客中会体现出来。

希尔排序

希尔排序就是快速排序的一种变种,其思想跟直接插入排序很类似,其实就是设置一个 跨度 进行插入排序。
算法思想:
step1. 设置一个跨度d, 在待排序列中取出这个这个跨度的序列。
这里写图片描述
step2. 在这个取出来的序列上进行插入排序。
相同的颜色组成组合进行插入排序。

step3. 减少跨度重复step1 step2 step3
(注:d的寻找可以查一下相关书籍)

    void shellSort(T arr[],int n){
        int gap=0;
        int i,j;
        T temp;
        while((gap*3+1)<n){
            gap=gap*3+1;
        }//寻找gap
        while(gap>0)
        {
            for(i=gap;i<n;i++){
                j=i-gap;
                temp=arr[i];
                while(j>=0&&arr[j]>temp)
                {
                    arr[j+gap]=arr[j];
                    j=j-gap;
                }
                arr[j+gap]=temp;
            }
            gap=(gap-1)/3;
        }
    }

还是十万的数据测试
insert Sort:8.37982
Shell sort:0.033566

这速度不用多说!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值