算法就是这么一回事(排序)(第四部分)
七、希尔排序
话说希尔排序就是把插入排序的按照一定算法在处理,导致效率提高
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
eg:以23个数, 10, 4, 1的步长序列进行希尔排序。
只不过这个排序方式真的要靠自己写出来很困难,那就记录下来吧
1 #include <iostream> 2 #include <iterator> 3 #include <vector> 4 #include <ctime> 5 #include <random> 6 #include <functional> 7 #include <algorithm> 8 using namespace std; 9 int intSwap(int& a,int& b) 10 { 11 int intswaptemp=a; 12 a=b; 13 b=intswaptemp; 14 return 0; 15 } 16 /*------------------------------------------- 17 -----------------希尔排序---------------------- 18 参数:迭代器; 19 这个需要对照插入排序来分析 20 int insertionSort(vector<int> &ivec) 21 { 22 int i,j,temp; 23 for(i=1;i<=ivec.size();i++) 24 { 25 j=i-1; 26 temp=ivec[i]; 27 while((temp<ivec[j])&&(j>=0)) 28 { 29 ivec[j+1]=ivec[j]; 30 j--; 31 } 32 ivec[j+1]=temp; 33 34 } 35 return 0; 36 } 37 ---------------------------------------------*/ 38 int shellSort(vector<int> &ivec) 39 { 40 for(int gap=ivec.size()/2;gap>0;gap/=2)//间隙最后为1,所以不会出现遗失 41 { 42 for(int i=gap;i<ivec.size();i++)//外层循环,表示次数 43 { 44 int key=ivec[i]; 45 int j=0; 46 for(j=i-gap;j>=0&&ivec[j]>key;j-=gap)//对应修改j每次都应该减少gap,而不是1 47 ivec[j+gap]=ivec[j]; 48 ivec[j+gap]=key; 49 } 50 } 51 return 0; 52 } 53 54 int main() 55 { 56 clock_t start,end; 57 vector<int> ivec,copyivec; 58 srand(14); 59 for(int i=0;i<10000;i++)//10k 60 ivec.push_back((int)rand()); 61 copyivec=ivec; 62 start=clock(); 63 shellSort(ivec); 64 end=clock(); 65 for(int i=0;i<10000;i+=500) 66 cout<<ivec[i]<<'\t'; 67 cout<<endl; 68 cout<<"the time of 1 is "<<end-start<<endl; 69 70 return 0; 71 }