希尔排序
a
希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
b
平均时间复杂度:O(nlogn)
c
实现:
1.把数组按照一定增量划分成若干个子序列(增量从数组长度/2开始,每次除以2递减直到1)
2.对每次划分的子序列都进行插入排序,直到最后增量为1,希尔排序就完成了
d
C语言
#include<stdio.h>
void ShellSort(int R[],int n){ /*希尔排序算法*/
int i,j,d;
int temp;
d=n/2; /*d取初值n/2*/
while (d>0){
for (i=d;i<n;i++){ /*将R[d..n-1]分别插入各组当前有序区*/
j=i-d;
while (j>=0 && R[j]>R[j+d]){
temp=R[j]; /*R[j]与R[j+d]交换*/
R[j]=R[j+d];
R[j+d]=temp;
j=j-d;
}
}
d=d/2; /*递减增量d*/
}
}
void main(){
int n[10];
printf("请输入10个数,以逗号隔开:");
scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&n[0],&n[1],&n[2],&n[3],&n[4],&n[5],&n[6],&n[7],&n[8],&n[9]);
ShellSort(n,10);
for(int i=0;i<=9;i++){
printf("%d ",n[i]);
}
printf("\n");
}
运行