造轮子博客链接
我对希尔排序的理解
在刚刚实现了插入排序之后
马上来看希尔排序 相对来说还是轻松了许多
我还能记得第一次学希尔排序肯定是零收获的
因为当时实现的时候 代码基本等于抄 然后让自己写肯定写不出来的
希尔排序相对插入排序快很多的原因
书上是这样写的 权衡了子数据的规模和有序性
我用我的理解来解释一下我是怎么看这句话的
插入排序本身的优势就是在于 对于一些已经排好序的数组
是相对其他数组快的多的
然后希尔排序刚开始排序的方式是从间隔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