Java学习-插入排序2-希尔排序

来源:互联网 发布:矩阵式组织与柔性组织 编辑:程序博客网 时间:2024/06/13 18:01

希尔排序:

       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)。

//分析是我在其他博客上看到的,感觉分析的很透彻,可以借鉴学习一下大笑大笑


0 0