算法就是这么一回事(排序)(第四部分)

七、希尔排序

  话说希尔排序就是把插入排序的按照一定算法在处理,导致效率提高

  

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率

  但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位

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 }

 

posted @ 2014-11-09 19:32  菜鸟也会飞  阅读(189)  评论(0编辑  收藏  举报