3.一步一步分解快排

1.原理

Quick Sort 屬于交換排序,是對(duì)冒泡算法進(jìn)行的改造。

基本原理:分治法和填坑法

  • 分治法:
    1. 首先將問題轉(zhuǎn)化為子問題,取數(shù)組的第一個(gè)元素key,然后將數(shù)組里的所有元素小于key的放在左邊,大于key的放在右邊。
    • 此時(shí)再次重復(fù)這個(gè)過程,去小于key的元素,取第一個(gè)元素key2,然后將數(shù)組的所有元素小于key2的放在左邊,大于key2的放在右邊。
    • 再次重復(fù).......直到全部排序好。
  • 填坑法
    1. 用于數(shù)組排序,取第一個(gè)元素key,然后將a[0]空出來,然后i=0,j=n。
    2. 設(shè)置大循環(huán),保證i<j。
    3. 設(shè)置子循環(huán),從后往前找,如果大于key就執(zhí)行j--。
    4. 設(shè)置判定語句,如果小于key,將a[j]的值填入a[i]。
    5. 設(shè)置子循環(huán),從前往后找,如果小于key就執(zhí)行j++。
    6. 設(shè)置判定語句,如果大于key,就將a[i]的值填入a[j]。
    7. 大循環(huán)結(jié)束,將key值填入a[i]。
  • 填坑法第一步,設(shè)值,key,i,j



  • 從后往前第一次小循環(huán)



  • 從前往后第一次小循環(huán)



  • 從后往前第二次小循環(huán)



  • 結(jié)束大循環(huán),將key值填入a[i]。


2.java寫法

  • 分為兩部分:分治遞歸quicksort和partition方法。
    實(shí)現(xiàn)填坑法partition():
private static int partition(int a[], int i, int j) {
        int key = a[i];//key值
        while (i < j) {
            while (i < j && a[j] > key)// 從右向左小循環(huán)
                j--;
            if (a[j] <= key)//判定填充
                a[i] = a[j];
            while (i < j && a[i] < key)// 從左向右小循環(huán)
                i++;
            if (a[i] >= key)//判定填充
                a[j] = a[i];
        }
        a[i] = key;// 把軸元素放在軸所在地位置
        return i;// 返回軸所在的位置
    }

實(shí)現(xiàn)遞歸的quicksort():

private void quickSort(int data[], int low, int high) {// 遞歸
        int q;
        if (low < high) {
            q = partition(data, low, high);
            quickSort(data, q + 1, high);//對(duì)q左邊進(jìn)行分類
            quickSort(data, low, q - 1);//對(duì)q右邊進(jìn)行分類
        }
    }

3.時(shí)間復(fù)雜度

  • 對(duì)于劃分成子問題求解的問題,公式為:
    T(n) = a*T(n/b)+f(n)

  • 最好的情況,每次劃分都是按照折半劃分,快排的a=b=2,f(n)為partition()的規(guī)模。公式為:
    T(n) = 2*T(n/2)+f(n)
    例如 3,2,4。
    復(fù)雜度為T(n) = O(nlogn)

  • 最壞的情況,每次劃分都是:
    T(n) = T(n-1)+T(1)+f(n)
    例如 2,3,4。
    復(fù)雜度為T(n) = O(n^2)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,769評(píng)論 0 33
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,220評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,743評(píng)論 0 15
  • 1, iOS項(xiàng)目架構(gòu)文檔 ? ?? ? 2、 ios標(biāo)簽云3d旋轉(zhuǎn) 兩手指滑動(dòng)標(biāo)簽球,...
    plantAtree_dAp閱讀 169評(píng)論 7 0
  • 拖延癥現(xiàn)在很普遍,也會(huì)有很多人對(duì)此苦惱,其實(shí)大可不必?fù)?dān)心,它在一定范圍內(nèi)還是挺好的使用的,沒有什么是極端化的...
    升fa閱讀 506評(píng)論 0 3