算法導(dǎo)論公開課筆記(二)快速排序和隨機(jī)化算法

快速排序

與歸并排序一樣茶宵,快速排序也使用了分治的思想解決排序問題瓣窄。
對一個(gè)典型的子數(shù)組A[p..r]進(jìn)行快速排序的三步分治過程:

  • 分解:數(shù)組A[p..r]被劃分為兩個(gè)(可能為空)子數(shù)組A[p..q-1]和A[q+1..r]匙瘪,使得A[p..q-1]中的每一個(gè)元素都小于等于A[q],而A[q]也小于等于A[q+1..r]中的每個(gè)元素厢呵。其中計(jì)算下標(biāo)q也算劃分過程的一部分窝撵。
  • 解決: 通過遞歸調(diào)用快速排序,對子數(shù)組A[p..q-1]和A[q+1..r]進(jìn)行排序襟铭。
  • 合并:因?yàn)樽訑?shù)組都是原址排序碌奉,所以不需要額外的合并操作:數(shù)組A[p..r]已經(jīng)有序。

偽代碼實(shí)現(xiàn)快速排序:

QUICKSORT(A,p,r)
  if p < r
    q=PARTITION(A,p,r)
     QUICKSORT(A,p,q-1)
     QUICKSORT(A,q+1,r)

Java實(shí)現(xiàn)版:

    /**
     * 
     * @param src 待排序的數(shù)組
     */
    public static void quickSort(int[] src,int left ,int right){
        if(left<right){
            int mid=partition(src, left, right);
            quickSort(src, left, mid-1);
            quickSort(src, mid+1, right);
        }
    }

數(shù)組的劃分
算法的關(guān)鍵部分就是PARTITION過程寒砖,它實(shí)現(xiàn)了對子數(shù)組A[p..r]的原址重排赐劣。

PARTITION(A,p,r)
  x=A[r]
  i=p-1
  for j=p to r-1
    if A[j]<=x
      i=i+1
      exchange A[i] with A[j]
  exchange A[i+1] with A[r]
  return i+1
快速排序的劃分和過程
快速排序分解過程

Java實(shí)現(xiàn)版:

    /**
     * 劃分操作
     * 
     * @param src
     *            待排序的數(shù)組
     * @param left
     *            左邊界
     * @param right
     *            右邊界
     */
    public static int partition(int[] src, int left, int right) {   
    
        int key = src[left];//挖坑
        int i = left;
        int j = right;
        while (i < j) {
            while (i < j && src[j] > key) {
                j--;
            }
            
            if (i < j) {
                src[i++] = src[j];// 挖坑填數(shù)
            }

            while (i < j && src[i] < key) {
                i++;
            }
            
            if (i < j) {
                src[j--] = src[i];// 挖坑填數(shù)
            }

        }
        src[i] = key;//填空

        // 這種情況下第一趟結(jié)束 i的坐標(biāo)都比他小i的右邊都比他大
        return i;

    }

隨機(jī)化版本的快速排序

在理解了快速排序的劃分過程之后,隨機(jī)化快速排序的過程就很好理解了哩都。
首先隨機(jī)化快排是為了解決出現(xiàn)最壞情況時(shí) Ω(n^2)的運(yùn)行時(shí)間的問題魁兼,將快速排序變成一個(gè)“穩(wěn)定”的算法,隨機(jī)化后漠嵌,快排的期望運(yùn)行時(shí)間為O(n* lg n)咐汞。
隨機(jī)化快排其實(shí)做的很簡單,就是在劃分的時(shí)候儒鹿,不是確定性的選擇主元(provit)化撕,而是隨機(jī)的選擇主元,這要就保證了只有很小的幾率下每次都出現(xiàn)最壞的劃分情況挺身。
隨機(jī)化快排的劃分過程:

    /**
     * 隨機(jī)劃分操作
     * 
     * @param src
     *            待排序的數(shù)組
     * @param left
     *            左邊界
     * @param right
     *            右邊界
     */
    public static int randomizedPartition(int[] src, int left, int right) {

        /*隨機(jī)選取主元元素*/
        Random random = new Random();
        int random_index = random.nextInt(right-left+1)+left;
        System.out.println("random_index="+random_index);
        
        /**
         * 交換
         */
        int temp = src[random_index];
        src[random_index] = src[left];
        src[left]=temp;
        
        int key = src[left];//挖坑
        int i = left;
        int j = right;
        while (i < j) {
            while (i < j && src[j] > key) {
                j--;
            }
            
            if (i < j) {
                src[i++] = src[j];// 挖坑填數(shù)
            }

            while (i < j && src[i] < key) {
                i++;
            }
            
            if (i < j) {
                src[j--] = src[i];// 挖坑填數(shù)
            }

        }
        src[i] = key;//填空

        // 這種情況下一趟結(jié)束 i的坐標(biāo)都比他小i的右邊都比他大
        return i;

    }

以上侯谁,謝謝閱讀,希望你有所收獲章钾!

算法導(dǎo)論公開課筆記(一)算法分析與設(shè)計(jì)
算法導(dǎo)論公開課筆記(二)快速排序和隨機(jī)化算法
算法導(dǎo)論公開課筆記(三)線性時(shí)間排序
算法導(dǎo)論公開課筆記(四)順序統(tǒng)計(jì)墙贱、中值
動(dòng)態(tài)規(guī)劃算法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贱傀,隨后出現(xiàn)的幾起案子惨撇,更是在濱河造成了極大的恐慌,老刑警劉巖府寒,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魁衙,死亡現(xiàn)場離奇詭異报腔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剖淀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門纯蛾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纵隔,你說我怎么就攤上這事翻诉。” “怎么了捌刮?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵碰煌,是天一觀的道長。 經(jīng)常有香客問我绅作,道長芦圾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任俄认,我火速辦了婚禮个少,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梭依。我一直安慰自己稍算,他們只是感情好典尾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布役拴。 她就那樣靜靜地躺著,像睡著了一般钾埂。 火紅的嫁衣襯著肌膚如雪河闰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天褥紫,我揣著相機(jī)與錄音姜性,去河邊找鬼。 笑死髓考,一個(gè)胖子當(dāng)著我的面吹牛部念,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氨菇,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼儡炼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了查蓉?” 一聲冷哼從身側(cè)響起乌询,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎豌研,沒想到半個(gè)月后妹田,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唬党,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年鬼佣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驶拱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晶衷,死狀恐怖屯烦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情房铭,我是刑警寧澤驻龟,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站缸匪,受9級特大地震影響翁狐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凌蔬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一露懒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砂心,春花似錦懈词、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至译暂,卻和暖如春抠忘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背外永。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工崎脉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伯顶。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓囚灼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親祭衩。 傳聞我的和親對象是個(gè)殘疾皇子灶体,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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

  • quicksort可以說是應(yīng)用最廣泛的排序算法之一,它的基本思想是分治法汪厨,選擇一個(gè)pivot(中軸點(diǎn))赃春,將小于pi...
    黎景陽閱讀 447評論 0 1
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序劫乱,而外部排序是因排序的數(shù)據(jù)很大织中,一次不能容納全部...
    每天刷兩次牙閱讀 3,730評論 0 15
  • 概述 排序有內(nèi)部排序和外部排序锥涕,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大狭吼,一次不能容納全部...
    蟻前閱讀 5,183評論 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,253評論 0 2
  • 所有過往的傷口层坠,無所謂愈合不愈合,都會久久停留在你的體內(nèi)刁笙,然后等待著重新的蘇醒破花。這以后它會讓你的心疼痛的抽搐扭曲。...
    玖玖傾聽閱讀 271評論 0 0