希尔排序实质上是一种分组插入方法;比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比[2] 较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。一般的初次取序列的一半为增量,以后每次减半,直到增量为1。
希尔排序的思想:
下面举列子说明:比如有一个待排序的系列:3 2 1 6 4 5;初始增量为size的一半为3.
依次减小增量,进行分组插入排序。最后增量必须为1;
希尔排序是一种不稳定的排序算法。需要一个辅助空间。
希尔排序的时间复杂度为:O(n^3/2);最差为O(n^2);
算法实现:
#include <stdio.h>
#include <stdlib.h>
void shellSort(int arr[],int size){
int i,j,temp,k;
for(i=size/2;i>0;i/=2){//获得增量
for(j=i;j<size;j++){//插入排序
for(k=j-i;k>=0;k-=i){
if(arr[k+i]>arr[k]){
break;
}
else{
temp=arr[k+i];
arr[k+i]=arr[k];
arr[k]=temp;
}
}
}
}
}
int main()
{
int n,i;
scanf("%d",&n);
int arr[n];
for(i=0;i<n;i++){
scanf("%d",&arr[i]);
}
shellSort(arr,n);
for(i=0;i<n;i++){
printf("%d ",arr[i]);
}
return 0;
}