【每日一题(25)】初等排序算法(2) 希尔排序(shell sort)

希尔排序

介绍

希尔排序是插入排序的延伸,是第一批冲破O(n2)的算法之一。
希尔排序在一定意义上有分治的影子,拆分成n组不同的增量的分组,进行插入排序。

有相关证明表示,当增量为1,4,13……时,平均复杂度会降至O(n1.25)。
即 a(n + 1) = 3 * a(n) + 1;

代码

“`C
#include
#include
using namespace std;
void _printf(int *a,int n){
for(int i = 0;i < n; i++){
cout << a[i] << ” “;
}
cout << endl;
}
void sort(int *a,int n){
int flag = 0,add[30] = {1};
while(add[flag] < n){
add[flag + 1] = 3*add[flag] + 1;
flag++;
}
flag–;
//_printf(add,flag);
while(flag >= 0){
for(int i = add[flag];i >= 0; i–){
for(int j = i + add[flag];j < n; j += add[flag]){
for(int t = i;t < j; t += add[flag]){
if(a[j] < a[t]){
int x = a[j];
for(int y = j;y > t; y -= add[flag]){
a[y] = a[y – add[flag]];
}
a[t] = x;
}
}
}
}
flag–;
}

}
int main()
{
clock_t begin,stop;
int n;
while(cin >> n){
int *a = new int[n];
for(int i = 0;i < n; i++){
cin >> a[i];
}
begin = clock();
sort(a,n);
stop = clock();
_printf(a,n);
cout << “runtime ” << (double)(stop – begin)/CLOCKS_PER_SEC << “s” << endl;
}

 return 0;

}
“`

### 速度 ###

希尔排序的复杂度理论上比插入排序以及选择排序更低,但是。。。
无解

数据量运行时间
50000.088s
200001.337s
500009.289s
10000036.157s
点赞