希尔排序是基于插入排序的以下两点性质而提出改进方法
希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。
#include <stdio.h>
#include <malloc.h>
//进行哈希排序
void shellsort(int a[],int num){
int step,i,j,key;
for(step=num/2;step>0;step/=2){ 以nStep分组,nStep每次减为原来的一半。
//下面进行插入排序 只是每次增加不是1而是step
for(i=step;i<num;i++){
key=a[i];
for(j=i-step;j>=0&&a[j]>key;j-=step){
a[j+step]=a[j];
}
a[j+step]=key;
}
}
}
//将结果输出
void putout(int a[],int n){
int i;
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
}
int main(){
int num,*n,i;
printf("要输入几个数进行排序:");
scanf("%d",&num);
n=(int *)malloc(sizeof(int)*num);
for(i=0;i<num;i++){
printf("请输入第%d个数:",i+1);
scanf("%d",n+i);
fflush(stdin);
printf("\n");
}
shellsort(n,num);
putout(n,num);
return 0;
}