快速排序 - 容易中招的地方

快速排序在抛,也是一種二分的思想,選取一個基準數谅将,然后將大于和小于基準的元素分別放置于基準數兩邊,然后繼續(xù)按此方法分治基準數的兩側重慢,直至最后一個元素饥臂。

那么快排的實現需要解決以下幾個問題:

  1. 基準數的選擇
  2. 元素的查找
  3. 遞歸調用
  4. 基準數的歸位

對應處理:

  1. 通常選取頭或者尾元素
  2. 一組一組的查找需要交換位置的元素
  3. 既然是遞歸,就一定要有終止遞歸的臨界條件似踱,要不然肯定會導致調用堆棧溢出
  4. 歸位隅熙,查找相遇的位置和基準位元素互換

對于第二點,需要注意元素查找的先后順序核芽,以從小到大排序為例:

  • 如果 基準數選取的為arr[low] 囚戚, 那么必須先從高位high查找到小于pivot的數,然后再從低位low尋找大于pivot的數轧简,交換驰坊;
  • 如果 基準數選取的為arr[high] , 那么必須先從低位low查找到大于pivot的數哮独,然后再從高位high尋找小于pivot的數拳芙,交換;

原因是皮璧, 當兩側的查找相遇時候舟扎,需要將基準數pivot 和相遇點元素的值交換以正確歸位基準數pivot; 也就是pivot = arr[low] 這種情況 相遇點的元素值必須要小于pivot的值悴务,如果先從低位low查找大于pivot的元素睹限,最終停止的元素大于pivot的話 就會導致歸位失敗惨寿;

要更清晰的看具體的差別邦泄,可以交換下面代碼中的 查找順序删窒,然后斷點一步步查看差別裂垦; 其實我們寫代碼,思路有了肌索,輸入輸出的條件限制清晰后代碼實現可能只需要花20%的時間蕉拢,還有80%的時間則花在一步步的驗證邊界情形上; 這邊查找順序的差別個人就斷點調試了很多遍,也在紙上畫出反例會出現的情況才得以印象深刻晕换。

    /* 快速排序 */
    function quickSortUnit(arr,low,high){
        var temp,
            pivot = arr[high];
        while(low < high){      
            /* 查找順序要和基準選取相反午乓;
             pivot = arr[high] 則必須先從low開始;
             反之 pivot = arr[low]; 則必須先從high開始查找 */
            while(arr[low] <= pivot && low < high)
                low++; 
            arr[high] = arr[low];
            while(arr[high] >= pivot && low < high)
                high--;  
            arr[low] = arr[high];
        }
        // 校準闸准,將基準移至正確位置
        arr[low] = pivot;
        return low;
    }

    function quickSort(arr,low,high){
         if(low >= high) return;
         var index = quickSortUnit(arr,low,high);
         quickSort(arr,low,index-1);
         quickSort(arr,index+1,high);
    }

附上一個網站 https://visualgo.net/sorting 可視化排序的過程

圖片.png

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末益愈,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子夷家,更是在濱河造成了極大的恐慌蒸其,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件库快,死亡現場離奇詭異摸袁,居然都是意外死亡,警方通過查閱死者的電腦和手機义屏,發(fā)現死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門靠汁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闽铐,你說我怎么就攤上這事蝶怔。” “怎么了兄墅?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵添谊,是天一觀的道長。 經常有香客問我察迟,道長斩狱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任扎瓶,我火速辦了婚禮所踊,結果婚禮上,老公的妹妹穿的比我還像新娘概荷。我一直安慰自己秕岛,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布误证。 她就那樣靜靜地躺著继薛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愈捅。 梳的紋絲不亂的頭發(fā)上遏考,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音蓝谨,去河邊找鬼灌具。 笑死青团,一個胖子當著我的面吹牛,可吹牛的內容都是我干的咖楣。 我是一名探鬼主播督笆,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诱贿!你這毒婦竟也來了娃肿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤珠十,失蹤者是張志新(化名)和其女友劉穎咸作,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體宵睦,經...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡记罚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了壳嚎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桐智。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烟馅,靈堂內的尸體忽然破棺而出说庭,到底是詐尸還是另有隱情,我是刑警寧澤郑趁,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布刊驴,位于F島的核電站,受9級特大地震影響寡润,放射性物質發(fā)生泄漏捆憎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一梭纹、第九天 我趴在偏房一處隱蔽的房頂上張望躲惰。 院中可真熱鬧,春花似錦变抽、人聲如沸础拨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诡宗。三九已至,卻和暖如春击儡,著一層夾襖步出監(jiān)牢的瞬間塔沃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工曙痘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芳悲,地道東北人立肘。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓边坤,卻偏偏與公主長得像名扛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茧痒,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內容

  • quicksort可以說是應用最廣泛的排序算法之一肮韧,它的基本思想是分治法,選擇一個pivot(中軸點)旺订,將小于pi...
    黎景陽閱讀 441評論 0 1
  • 版權聲明:本文源自簡書tianma弄企,轉載請務必注明出處:http://www.reibang.com/p/df8a...
    tianma閱讀 4,357評論 0 3
  • 算法的個人理解: 基于分治思想,將復雜的問題簡單化区拳;具體的做法是在待排序的數組中拘领,選取一個基準數,這個基準數...
    開開心心美滋滋閱讀 476評論 0 0
  • 概述 排序有內部排序和外部排序樱调,內部排序是數據記錄在內存中進行排序约素,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,164評論 0 52
  • 概述:排序有內部排序和外部排序笆凌,內部排序是數據記錄在內存中進行排序圣猎,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,727評論 0 15