希尔排序:
1.基本思路:
先取一个小于n的整数d1作为一个增量,把数组中的数分为d1组,i+d1个数分别为一组,对每个组内的数进行直接插入排序.取第二个数d2<d1作为第二个增量,重复第一步的分组和排序,直至d=1,即所有记录放在同一组中进行直接插入排序为止,希尔排序的实质就是分组进行直接插入排序。
//**数据结构书上讲的有关于希尔排序的方法,,作为一种基础排序方法,还是要掌握滴**//
2:实例
解释一下:当一次增量为5时,57和28是一组,68和96是一组,59和33是一组,52和24是一组,72和19是一组;
对一次分组进行直接插入排序,排序后结果如第二行所示。当第二次增量为3时,28,24,96,72是一组,68,19,59是一
组,33,57,52是一组,再进行排序,结果如第三行所示。直至增量为1时,对其再进行排序,结果如图所示。
3:源代码;
package xierpaixu;
public class xierpaixu {
public static void main(String args[]){
int[] array = {23,34,12,45,56,43,67,65,78,76};
System.out.println("排序之前:");
for(int i=0;i<array.length;i++)
System.out.print(array[i]+" ");
int d=array.length;
while(true){
d=d/2; //进行分组
for(int i =0;i<d;i++){
for(int x=i+d;x<array.length;x++){ //确定数组内顺序为i+d的数为一组
int temp=array[x];
int j;
for(j=x-d;j>=0&&array[j]>temp;j=j-d){ //对组内元素进行直接插入排序
array[j+d] = array[j];
}
array[j+d] = temp;
}
}
if(d == 1){
break; //当增量d=1时结束。
}
}
System.out.println();
System.out.print("排序之后:");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
}
}
4、分析
我们知道一次插入排序是稳定的,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。
希尔排序的时间性能优于直接插入排序,原因如下:
(1)当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。
(2)当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。
(3)在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。
因此,希尔排序在效率上较直接插人排序有较大的改进。
希尔排序的平均时间复杂度为O(nlogn)。
//分析是我在其他博客上看到的,感觉分析的很透彻,可以借鉴学习一下