排序系列 之 希爾排序算法 —— Java實現


 基本思想:

  希爾排序的實質就是分組插入排序,又稱縮小增量法。

  將整個無序序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然后依次縮減增量再進行排序,待整個序列中的元素基本有序時,再對全體元素進行一次直接插入排序。

  因為直接插入排序在元素基本有序的情況下,效率是很高的,因此希爾排序在時間效率上有很大提高

 實例:

  無序序列:int a[] = {3,1,5,7,2,4,9,6};

  第一趟時: n=8; gap=n/2=4; 把整個序列共分成了4個子序列{3,2}、{1,4}、{5,9}、{7,6}

  第二趟時:gap=gap/2=2; 把整個序列共分成了2個子序列{2,5,3,9}、{1,6,4,7}

  第三趟時:對整個序列進行直接插入排序

  

  希爾排序是不穩定的

 

 Java實現:

package sort;
/**
 * 希爾排序 算法 的實現
 * @author 那一季的銀杏葉
 *
 */
public class ShellSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new ShellSort().run();
    }

    private void run() {
        // TODO Auto-generated method stub
        int a[] = {3,1,5,7,2,4,9,6};
        System.out.println("———————————————————希爾排序算法—————————————————————");
//        shellSort(a);
        shellSort2(a);
        printResult(a,a.length);
    }
    /**
     * 希爾排序(縮小增量法) 屬於插入類排序  
     * 不穩定
     * @param a
     */
    private void shellSort(int[] a){
        int n=a.length;
        int gap=n/2;
        while(gap>=1){
            for(int i=gap;i<a.length;i++){
                int j=0;
                int temp = a[i];
                for(j=i-gap;j>=0 && temp<a[j];j=j-gap){
                    a[j+gap] = a[j];
                }
                a[j+gap] = temp;
            }
            printResult(a,a.length);
            gap = gap/2;
        }
    }
    /**
     * 嚴格按照定義來寫的希爾排序
     * @param a
     */
    private void shellSort2(int[] a){
        int n=a.length;        
        int i,j,k,gap;
        for(gap=n/2;gap>0;gap/=2){
            for(i=0;i<gap;i++){        
                for(j=i+gap;j<n;j+=gap){
                    int temp = a[j];
                    for(k=j-gap;k>=0 && a[k]>temp;k-=gap){
                        a[k+gap]=a[k];
                    }
                    a[k+gap]=temp;
                }
            }
            printResult(a,a.length);
        }
    }
    private void printResult(int[] a, int n){
        for(int j=0;j<n;j++){
            System.out.print(" "+a[j]);
        }
        System.out.println();
    }
}

 運行結果展示:

 

  (本文僅供學習交流,如有更好的思路,歡迎留下意見供大家探討學習~) 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM