排序-shell排序

在插入排序中,所有的元素都是挨个和前一个元素进行比较,并置换位置。所以交换的次数为N的平方级别。极端情况下,如果最小元素在最右侧,那么需要逐个和前面元素进行置换。如果将比较的间隔增大,那么会减少移动次数,然后逐次降低比较间隔。

于是比较的间隔的序列如下 h = 3*h+1。

代码如下:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 void change(int *p,int pos1,int pos2);
 6 void shellSort(int *p,int length);
 7 void print(int *p,int length);
 8 
 9 int main()
10 {
11     int p[] = {2,5,3,11,89,76,24,33,15};
12     shellSort(p,sizeof(p)/sizeof(int));
13     print(p,sizeof(p)/sizeof(int));
14     cout << "Hello world!" << endl;
15     return 0;
16 }
17 
18 void print(int *p,int length)
19 {
20     for(int i=0;i<length;i++)
21         cout << p[i] << endl;
22 }
23 
24 void shellSort(int *p,int length)
25 {
26     int h = 0;
27     while(h<length/3)
28     {
29         h=3*h+1;
30     }
31     while(h>=1)
32     {
33         for(int i=1;i<length;i++)
34         {
35             for(int j=i;j>=h&&p[j]<p[j-1];j-=h)
36             {
37                 change(p,j,j-h);
38             }
39         }
40         h = h/3;
41     }
42 }
43 
44 void change(int *p,int pos1,int pos2)
45 {
46     if(pos1 == pos2)
47     {
48         return;
49     }
50     int temp=p[pos1];
51     p[pos1] = p[pos2];
52     p[pos2] = temp;
53 }

目前要理解shell 排序的性能仍然是个挑战,这个需要靠专家努力,但最重要的结论就是,运行时间不到N的平方级别。

posted on 2017-08-18 13:36  ^~~^  阅读(137)  评论(0编辑  收藏  举报

导航