歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Java排序算法--希爾排序(Shellsort)

Java排序算法--希爾排序(Shellsort)

日期:2017/3/1 9:11:50   编辑:SHELL編程

希爾排序

希爾排序:它通過比較相距一定間隔的元素來工作,各趟比較所用的距離隨著算法的進行而減小,直到只比較相鄰元素的最後一趟排序為止。希爾排序也叫縮減增量排序(diminishing increment sort)。

希爾排序使用一個序列h1,h2,h3,…,ht,叫做增量序列(increment sequence)。在使用增量hk的一趟排序之後,對於每一個i我們都有a[i] ≤ a[i+hk],所有相隔hk的元素都被排序,此時稱文件是hk排序的(hk-sorted)。希爾排序的一個重要性質:一個hk排序的文件(然後將是hk-1排序的)保持它的hk排序性。

hk排序的一般做法是,對於hk,hk+1,...,N-1中的每一個位置i,把其上的元素放到i,i-hk,i-2hk,...中的正確位置上。一趟hk排序的作用就是對hk個獨立的子數組執行一次插入排序。

Shell建議序列:ht=N/2值的下界,hk=hk+1/2值的下界。使用希爾增量的希爾排序:

    /**
     * Shellsort,using Shell's(poor) increments
     * @param a an array of Comparable items
     */
    public static <AnyType extends Comparable<? super AnyType>> void shellsort(AnyType[] a){
    	int j;
    	for(int gap=a.length/2;gap>0;gap/=2){
    		for(int i=gap;i<a.length;i++){
    			AnyType tmp = a[i];
    			for(j=i;j>=gap&&tmp.compareTo(a[j-gap])<0;j-=gap){
    				a[j] = a[j-gap];
    			}
    			a[j] = tmp;
    		}
    	}
    }

希爾排序的最壞情形分析

使用希爾增量時希爾排序的最壞情形運行時間為O(N2)。

Hibbard提出一個稍微不同的增量序列,它的增量形如1,3,7,...,2K-1。雖然這些增量幾乎是相同的,但關鍵的區別是相鄰的增量沒有公因子。

使用Hibbard增量的希爾排序的最壞情形運行時間為O(N3/2)。

Sedgewick提出幾種增量序列,其最壞情形運行時間(也是可以達到的)為O(N4/3)。其中最好的序列{1,5,19,41,109,...},該序列中的項或者是9*4i-9*2i+1形式,或者是4i-3*2i+1形式。

Copyright © Linux教程網 All Rights Reserved