快速排序及主定理

主定理顾瞻,主定理(英語:master theorem)提供了用漸近符號表示許多由分治法得到的遞推關系式的方法

在分治算法中德绿,分解荷荤、解決移稳、合并,使用遞歸解決一個個子問題再合并解決整體問題秒裕。對于此類算法的效率值袱蚓,可使用主定理推導確定几蜻。

主定理較為復雜喇潘,本文中提供一種簡化版本梭稚,以便理解:


Paste_Image.png

關于主定理詳細推導,可自己畫遞歸樹推導弧烤。
上篇文章提到的歸并排序忱屑,每次均是將整體問題分為兩個子問題暇昂,數組不斷遞歸莺戒,到每個子問題規(guī)模為1急波,那么一共會遞歸lgN次。而合并子問題的效率為N澄暮,所以算法整體效率為NlgN名段。它對應了上圖中的示例1.

快速排序,快速排序是使用最廣泛的排序方法伸辟,高效麻惶,空間占用小信夫。

它的核心思想是窃蹋,選取關鍵值k忙迁,將數組中小于k的值放到k的左邊碎乃,大于k的數值放到k的右邊姊扔。再遞歸解決小于k段的排序和大于k段的排序。最終每個子問題規(guī)模為1梅誓,肯定就是有序的

核心代碼為:

  public static int partition(int[] array, int p, int r){
    int k = array[r];
    int i = p - 1;
    for (int j = p; j < r; j++) {
        if (array[j] < k) {
            i ++;
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
    int temp = array[i + 1];
    array[i + 1] = array[r];
    array[r] = temp;
    return i + 1;
}

partition方法,將數組分成三段梗掰,一段為小于k段嵌言,一段為大于k段及穗,一段為未排序段。當遍歷發(fā)現未排序段位置不對時埂陆,則將此值與大于k段值交換位置苛白,最終將k值插入合適位置

partition另外一種寫法

public static int partition2(int[] array, int p, int r){
    int k = array[p];
    int i = p;
    int j = r;
    while (i < j) {
        while (i < j && array[j] > k) {
            j--;
        }
        if (i < j) {
            array[i] = array[j];
            i ++;
        }
        
        while(i < j && array[i] < k){
            i++;
        }
        if (i < j) {
            array[j] = array[i];
            j--;
        }
    }
    array[i] = k;
    return i;
}

partition2方法中產生一個冗余位置焚虱,數組中第一個元素已經被記錄在k中,所以第一個元素就是冗余元素鹃栽。從后開始遍歷躏率,如果某元素不在正確的位置上,則將此元素賦值到冗余位置上薇芝,之前的位置則成了新的冗余位置。

有了partition算法丰嘉,快排則非常簡單了夯到。

  public static void quickSort(int[] array,int p, int r){
    if (p < r) {
        int q = partition(array, p, r);
        quickSort(array, p, q - 1);
        quickSort(array, q + 1, r);
    }
}

從快排算法中可看出供嚎,快排算法包含三個方面峭状,將整體分成為2個n/2規(guī)模的子問題,同時再調用partition合并逼争,partition效率為N优床,所以對比上文中的主定理誓焦,可知快排的遞歸式為:

Paste_Image.png

所以其效率為N*lgN。

特別注意:選取關鍵值k對整個算法非常重要杂伟,如果每次選中的值均為整個數組中最小的值移层,那么整體算法的效率將退化到n的平方赫粥。為了達到隨機目的,可在選取k時越平,采用隨機數方式频蛔,再將隨機等到的關鍵字調換位置到0或尾部。

本博中涉及的所有代碼均已上傳到github晦溪,歡迎訪問博主的github主頁

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挣跋,隨后出現的幾起案子,更是在濱河造成了極大的恐慌避咆,老刑警劉巖舟肉,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牌借,死亡現場離奇詭異度气,居然都是意外死亡膨报,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門现柠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來院领,“玉大人够吩,你說我怎么就攤上這事比然≈苎” “怎么了万俗?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饮怯。 經常有香客問我闰歪,道長蓖墅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任论矾,我火速辦了婚禮教翩,結果婚禮上贪壳,老公的妹妹穿的比我還像新娘饱亿。我一直安慰自己寥袭,他們只是感情好路捧,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布传黄。 她就那樣靜靜地躺著队寇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佳遣。 梳的紋絲不亂的頭發(fā)上识埋,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天零渐,我揣著相機與錄音窒舟,去河邊找鬼诵盼。 笑死惠豺,一個胖子當著我的面吹牛风宁,可吹牛的內容都是我干的。 我是一名探鬼主播戒财,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼热监,長吁一口氣:“原來是場噩夢啊……” “哼饮寞!你這毒婦竟也來了孝扛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤苦始,失蹤者是張志新(化名)和其女友劉穎冈欢,沒想到半個月后盈简,有當地人在樹林里發(fā)現了一具尸體凑耻,經...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡柠贤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了臼勉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邻吭。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡宴霸,死狀恐怖,靈堂內的尸體忽然破棺而出瓢谢,到底是詐尸還是另有隱情畸写,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布枯芬,位于F島的核電站,受9級特大地震影響采郎,放射性物質發(fā)生泄漏千所。R本人自食惡果不足惜蒜埋,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望整份。 院中可真熱鬧待错,春花似錦、人聲如沸皂林。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烛占。三九已至,卻和暖如春忆家,著一層夾襖步出監(jiān)牢的瞬間犹菇,已是汗流浹背芽卿。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卸例,地道東北人称杨。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓筷转,卻偏偏與公主長得像姑原,于是被迫代替她去往敵國和親呜舒。 傳聞我的和親對象是個殘疾皇子锭汛,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內容

  • 概述 排序有內部排序和外部排序袭蝗,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大到腥,一次不能容納全部...
    蟻前閱讀 5,188評論 0 52
  • 概述:排序有內部排序和外部排序朵逝,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大廉侧,一次不能容納全部...
    每天刷兩次牙閱讀 3,732評論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,258評論 0 2
  • 本文有七千字闰蚕,閱讀大約需要占用你10分鐘時間栈拖。 好吧没陡。涩哟。隨便寫的,我也不知道會花多久看完贴彼。因為寫的比較爛,而且只是...
    鍋與盆閱讀 8,102評論 5 36
  • Google發(fā)布了Android O的第一個預覽版埃儿,手上有一臺Nexus 6p器仗,刷機試試。 首先打開Google搜...
    Leoshi閱讀 2,081評論 0 1