一、算法原理
希尔排序又称为“缩小排序”算法,是对直接插入排序方法的改进
希尔排序算法的基本思想是:先将整个待排记录序列分割成若干个子序列,然后分别进行直接插入排序,待整个序列
中的记录基本有序时,再对全体记录进行一次直接排序
二、算法举例
48 | 37 | 64 | 96 | 75 | 12 | 26 | 48 |54 | 3
三、算法实现
//shell排序
void ShellSort(int *data,int n){
int* delta; //增量序列
int i,j;
int k;
int dk;
int t;
//产生增量
delta = (int*)malloc(sizeof(int)*(n/2));
i = 0;
do{
k = k/2;
delta[i++] = k;
}while(k>0);
i = 0;
while((dk = delta[i])>0){
for(k = delta[i];k < n;k++){
//将元素data[k]插入有序增量标中
if(data[k]<data[k-dk]){
t = data[k]; //备份要插入元素
for(j=k-dk;j>=0&&t<data[j];j-=dk){
data[j+dk] = data[j];
}
data[j+dk] = t; //找到插入的位置,插入元素
}
++i;
}
}
free(delta);
}
四、算法复杂度分析
shell排序是一中不稳定的排序方法,据统计分析其时间复杂度约为O(n^1.3),排序过程中需要一个元素的辅助空间用于
数组元素值的交换,空间复杂度为O(1)