算法C++ 希尔排序代码实现(第二章)


造轮子博客链接

算法第四版C++算法实现全集


我对希尔排序的理解

在刚刚实现了插入排序之后
马上来看希尔排序 相对来说还是轻松了许多
我还能记得第一次学希尔排序肯定是零收获的
因为当时实现的时候 代码基本等于抄 然后让自己写肯定写不出来的

希尔排序相对插入排序快很多的原因
书上是这样写的 权衡了子数据的规模和有序性

我用我的理解来解释一下我是怎么看这句话的
插入排序本身的优势就是在于 对于一些已经排好序的数组
是相对其他数组快的多的

然后希尔排序刚开始排序的方式是从间隔h个数字的子数组中排序
然后就可以排序好部分子数组 使整个数组相对以前的更加有序

而相较插入数组如果我们要插入的数据刚好是数组的最小值
我们则需要把整个数组的数字全部向前移动 而希尔排序的优势就是可以交换远距离的数组中的数字 则使交换的代价小了很多


上面是我对于希尔排序性能提升我的理解
这里再写一下 希尔排序代码构造思路 免得以后我忘了 还可以回来看看我的思路

首先就是对于 排序我们h的选取
为什么是pow(3,n)+1 我也不是很清楚 反正就是
从size/3 到 1 距离开始 可能是因为实验得出来 排序效果好吧

然后就是从h开始 进行插入排序罢了
感觉也没什么多的思路了 就是间隔h的插入排序 知道h到1为止1


代码实现

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int temp,i,j,h = 1,size;
    vector<int> unsorted_vector;
    cout<<"please input ur unsorted_list ~ '-1' is the stop symbol"<<endl;
    while(cin>>temp)
    {
        if(temp == -1)  break;
        unsorted_vector.push_back(temp);
    }

    size = unsorted_vector.size();
    while(h<size/3) h = h*3+1;
    while(h>=1)
    {
        for(i=h;i<size;++i)
        {
            int temp = unsorted_vector[i];
            for(j=i;j>=h && unsorted_vector[j-h] > temp;j-=h)
                unsorted_vector[j] = unsorted_vector[j-h];
            unsorted_vector[j] = temp;
        }
        h/=3;
    }

    cout<<"this is the sorted_vector numbers"<<endl;
    for(const auto& num:unsorted_vector)
        cout<<num<<' ';
    return 0;
}


测试数据1

121 56 106 192 178 4 53 115 128 102 143 171 134 110 68 150 140 4 51 42


实现效果1

在这里插入图片描述


测试数据2

180 304 83 275 147 165 180 341 325 91 378 158 44 300 242 24 92 179 47 239


实现效果2

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love 6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值