shell排序算法

希尔排序(Shell Sort)又称为“缩小增量排序”。是1959年由D.L.Shell提出来的。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
具体做法:首先确定一组增量d0,d1,d2,d3,...,dt-1()其中n>d0>d1>...>dt-1=1),对于i=0,1,2,...,t-1,依次进行下面的各趟处理:根据当前增量di将n个元素分成di个组,每组中元素的下标相隔为di;再对各组中元素进行直接插入排序.

View Code
   
     
1 #include < iostream >
2
3   using namespace std;
4
5 // shell排序的一趟,d为当前增量
6 void shellPass( int a[], int d, int n)
7 {
8 int i,j,key;
9 for (i = d;i < n;i ++ ) // 增量之后的所有记录在自己所在组的进行插入排序
10 {
11 key = a[i]; // 当前记录
12 for (j = i - d;j >= 0 && a[j] > key;j -= d)
13 a[j + d] = a[j];
14 a[j + d] = key; // 定位当前记录
15 }
16 }
17
18 void shellSort( int a[], int n)
19 {
20 int inc = n;
21 do {
22 inc = inc / 3 + 1 ; // 下一趟增量
23 shellPass(a,inc,n);
24 } while (inc > 1 );
25 }
26
27 int main( int argc, char ** argv)
28 {
29 int a[] = { 43 , 2 , 56 , 4 , 3 , 43 };
30 shellSort(a, 6 );
31 for ( int i = 0 ;i < 6 ;i ++ )
32 cout << a[i] << " " ;
33 cout << endl;
34 return 0 ;
35 }

你可能感兴趣的:(shell)