希尔排序
- 实现思想
- 先将整个记录表分割成若干部分,分别进行直接插入排序,然后再对整个记录表进行一次直接插入排序。
- 时间复杂度
- 最好情况:O(n)
- 最坏情况:O(n²)
- 平均时间复杂度:O(N1.3)
- 空间复杂度
- 稳定性
代码
#include<stdio.h>
void InsertShell(int r[],int n,int dk){
int i,j;
for(i=dk+1;i<=n;i++){
if(r[i]<r[i-dk]){
r[0]=r[i];
for(j=i-dk;j>0&&r[0]<r[j];j-=dk)
r[j+dk]=r[j];
r[j+dk]=r[0];
}
}
}
void ShellSort(int r[],int n,int d[]){
int i;
for(i=1;i<=2;i++)
InsertShell(r,n,d[i]);
}
void Output(int r[],int n){
int i;
for(i=1;i<=n;i++){
printf("%d ",r[i]);
}
printf("\n");
}
void main(){
int n=8;
int r[9]={0,3,1,7,5,2,4,9,6};
int d[3]={5,3,1};
printf("未排序的集合为:\n");
Output(r,n);
ShellSort(r,n,d);
printf("从小到大排序后的集合为:\n");
Output(r,n);
}