程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java 疾速排序(QuickSort)道理及完成代碼

Java 疾速排序(QuickSort)道理及完成代碼

編輯:關於JAVA

Java 疾速排序(QuickSort)道理及完成代碼。本站提示廣大學習愛好者:(Java 疾速排序(QuickSort)道理及完成代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是Java 疾速排序(QuickSort)道理及完成代碼正文


疾速排序(QuickSort )是經常使用到的效力比擬高的一種排序算法,在面試進程中也常常說起。上面就具體講授一下他的道理、給出一個Java版本的完成。

疾速排序思惟:

經由過程對數據元素聚集Rn 停止一趟排序劃分出自力的兩個部門。個中一個部門的症結字比另外一部門的症結字小。然後再分離對兩個部門的症結字停止一趟排序,直到自力的元素只要一個,此時全部元素聚集有序。

疾速排序的進程——挖坑填數法(這是一個很抽象的稱號),對一個元素聚集R[ low ... high ] ,起首取一個數(普通是R[low] )做參照 , 以R[low]為基准從新分列一切的元素。

一切比R[low]小的放後面,一切比R[low] 年夜的放前面,然後以R[low]為分界,對R[low ... high] 劃分為兩個子集和,再做劃分。直到low >=  high 。

好比:對R={37, 40, 38, 42, 461, 5, 7, 9, 12}停止一趟疾速排序的進程以下(注:上面描寫的內容中元素下表從 0 開端):
原始序列 37 40 38 42 461 5 7 9 12 一:high-->low 12 40 38 42 461 5 7 9 12 一:low --> high 12 40 38 42 461 5 7 9 40 二:high-->low 12 9 38 42 461 5 7 9 40 二:low --> high 12 9 38 42 461 5 7 38 40 三:high --> low 12 9 7 42 461 5 7 38 40 三:low -->high 12 9 7 42 461 5 42 38 40 四:high --> low 12 9 7 5 461 5 42 38 40 四:low --> high 12 9 7 5 461 461 42 38 40 一趟排序成果 12 9 7 5 37 461 42 38 40

開端拔取基准 base = 37,初始地位下表 low = 0 , high = 8  , 從high=8,開端假如R[8] < base ,  將high地位中的內容寫入到R[low]中, 將high地位空出來, low = low +1 ;

從low開端探測,因為low=1 , R[low] > base ,所以將R[low]寫入到R[high] , high = high -1 ;

檢測到low < high ,所以第一趟疾速排序仍需持續:

此時low=1,high=7,由於 R[high] < base ,所以將 R[high] 寫入到到R[low]中,low = low + 1;

從low開端探測,low = 2 , R[low] >base ,所以講R[low]寫入到R[high],high=high-1;

持續檢測到 low 小於high


此時low=2,high=6,同理R[high] < base ,將R[high] 寫入到R[low]中,low=low+1;

從low持續探測,low = 3 , high=6 , R[low] > base , 將R[low]寫入到R[high]中,high = high-1;

持續探測到low小於high

此時low=3,high=5,同理R[high] < base,將R[high]寫入到R[low]中,low = low +1;

從low持續探測,low = 4,high=5,因為R[low] > base , 將R[low]寫入到R[high]中,high = high -1 ;

此時探測到low == high == 4 ;該地位等於base地點的地位,將base寫入到該地位中.

然後再對子序列Rs1 = {12,9,7,5} 和 Rs2={461,42,38,40}做一趟疾速排序,直到Rsi中只要一個元素,或沒有元素。

(注: 在以上表單中可以看到一趟排序中有一些反復的數據(原始數據中沒有反復的數據),這是由於沒有消除該地位的數據,我們在特定的時光看該內存塊的數據仍然是它,直到下一次將數據寫入該地位地位 —— 在此該地位的數據是一個沒成心義髒數據,稱之為 “坑”)

疾速排序的Java完成:

private static boolean isEmpty(int[] n) {
        return n == null || n.length == 0;
    }

    // ///////////////////////////////////////////////////
    /**
     * 疾速排序算法思惟——挖坑填數辦法:
     *
     * @param n 待排序的數組
     */
    public static void quickSort(int[] n) {
        if (isEmpty(n))
            return;
        quickSort(n, 0, n.length - 1);
    }

    public static void quickSort(int[] n, int l, int h) {
        if (isEmpty(n))
            return;
        if (l < h) {
            int pivot = partion(n, l, h);
            quickSort(n, l, pivot - 1);
            quickSort(n, pivot + 1, h);
        }
    }

    private static int partion(int[] n, int start, int end) {
        int tmp = n[start];
        while (start < end) {
            while (n[end] >= tmp && start < end)
                end--;
            if (start < end) {
                n[start++] = n[end];
            }
            while (n[start] < tmp && start < end)
                start++;
            if (start < end) {
                n[end--] = n[start];
            }
        }
        n[start] = tmp;
        return start;
    }

在代碼中有如許一個函數:

 public static void quickSortSwap(int[] n, int l, int h)

該函數可以完成,元素聚集中特定的  l  到  h 地位間的數據元素停止排序。
關於疾速排序就寫到這裡了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved