排序-shell排序

Posted ^~~^

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序-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的平方级别。

以上是关于排序-shell排序的主要内容,如果未能解决你的问题,请参考以下文章

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

排序-shell排序

希尔排序(Shell Sort)

在c ++中使用线程进行Shell排序[重复]

java Shell排序

Java排序算法 - 堆排序的代码