一、希尔排序
希尔排序,其实属于一种特殊的插入排序,是简单排序算法里面的直接插入排序的改进版。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。希尔排序先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量为1,即所有记录放在同一组中进行直接插入排序为止一般的初次取序列的一半为增量,以后每次减半,直到增量为1。
1、代码
import java.util.Arrays;
public class Main{//希尔排序
public static void main(String[] args){
int[] a=new int[]{1,3,1,2,0,34,5,2,6,2,0,-3,-1,22,44,-11,0,-1,43,222,-2,-56,33,90,22};
int n=a.length;
int d=n;//增量
while(true){
d=d/2;//第一个增量为元素数量一半
for(int x=0;x<d;x++)//对各个分组进行插入排序
for(int i=x+d;i<n;i=i+d){//对其中某个分组进行插入排序
int temp=a[i];
int j;
for(j=i-d;j>=0&&a[j]>temp;j=j-d)
a[j+d]=a[j];
a[j+d]=temp;
}
if(d==1)
break;
}
System.out.println(Arrays.toString(a));
}
}
2、时间和空间复杂度分析
希尔排序的增量选择对其性能有很大的影响。希尔排序的时间性能比插入排序有较大的改进。这是因为在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。希尔排序的时间复杂度分析很难从数学上分析,但是平均来说当n较大时候ÿ