希尔排序

 1 #include <iostream>
 2 #include <cstdlib>
 3 
 4 #define ARR_SIZE 10
 5 
 6 using namespace std;
 7 
 8 void shellshort(int a[]);
 9 void CreateRandArr(int a[]);
10 void exchange(int *a, int *b);
11 
12 int main()
13 {
14     int a[ARR_SIZE];
15     int i;
16     CreateRandArr(a);
17     shellshort(a);
18     cout << "after sort: " << endl;
19     for(i=0;i<ARR_SIZE;i++)
20     {
21         cout << a[i] << ' ' ;
22     }
23     
24     return 0;
25 }
26 
27 /* 记住,希尔排序只是比插入排序多了一层while循环和一个递增序列,最内部的for循环把插入排序的1替换成当前递增量h就行了 */
28 void shellshort(int a[])
29 {
30     int i, j, temp, h=1;
31     while(h < ARR_SIZE/3)h=h*3 +1;   /* 构造递增序列 */
32     while(h>=1)
33     {
34         for(i=h; i<ARR_SIZE; i++)    /* 外围这个for循环每进行一次相当于对每个间隔为h的序列的第i个元素做排序 */
35         {
36             for(j=i; j>=h && a[j]<a[j-h]; j-=h)   /* 注意这里j的条件是j>=h.否则j-h可能取值小于0 */
37             {
38                 exchange(&a[j], &a[j-h]);
39             }
40         }
41         h = h/3;   /* 按递增序列逐步缩小h,由递增序列可知最后h一定可以等于1,届时相当于插入排序 */
42     }
43     
44 }
45 
46 void CreateRandArr(int a[])
47 {
48     int i;
49     for(i=0;i<ARR_SIZE;i++)
50     {
51         a[i] = rand() % 100;
52         cout <<a[i] << ' ' ; 
53     }
54     cout << endl;
55 }
56 
57 void exchange(int *a, int *b)
58 {
59     int temp;
60     temp = *a;
61     *a = *b;
62     *b = temp;
63 }

 

posted @ 2021-02-11 11:29  大黑耗  阅读(72)  评论(0编辑  收藏  举报