http://sjjp.tjuci.edu.cn/sjjg/datastructure/ds/web/paixu/paixu8.2.2.1.htm
http://zh.wikipedia.org/wiki/希尔排序
已知的最好步长序列由Marcin Ciura设计(1,4,10,23,57,132,301,701,1750,…)。
希尔排序的一个简单算法:
1
//
希尔排序
2 template < typename T >
3 bool shell_sort(std::vector < T > & A )
4 {
5 int increment = A.size() / 2 ;
6 while (increment >= 1 )
7 {
8 shell_pass(A , increment);
9 if (increment == 2 )
10 increment = 1 ;
11 else
12 increment = increment / 2.2 ;
13 }
14 return true ;
15 }
16
17 // 一趟排序
18 template < typename T >
19 bool shell_pass(std::vector < T > & A , int increment)
20 {
21 for ( int j = increment; j < A.size(); j += increment)
22 {
23 T key = A[j];
24 int i = j - increment;
25 while (i >= 0 && A[i] > key) // < 非升序排列 , > 非降序排列
26 {
27 A[i + 1 ] = A[i];
28 i -= increment;
29 }
30 A[i + increment] = key;
31 }
32 return true ;
33
34
35 return true ;
36 }
2 template < typename T >
3 bool shell_sort(std::vector < T > & A )
4 {
5 int increment = A.size() / 2 ;
6 while (increment >= 1 )
7 {
8 shell_pass(A , increment);
9 if (increment == 2 )
10 increment = 1 ;
11 else
12 increment = increment / 2.2 ;
13 }
14 return true ;
15 }
16
17 // 一趟排序
18 template < typename T >
19 bool shell_pass(std::vector < T > & A , int increment)
20 {
21 for ( int j = increment; j < A.size(); j += increment)
22 {
23 T key = A[j];
24 int i = j - increment;
25 while (i >= 0 && A[i] > key) // < 非升序排列 , > 非降序排列
26 {
27 A[i + 1 ] = A[i];
28 i -= increment;
29 }
30 A[i + increment] = key;
31 }
32 return true ;
33
34
35 return true ;
36 }