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

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

那么快排的實現(xiàn)需要解決以下幾個問題:

  1. 基準數(shù)的選擇
  2. 元素的查找
  3. 遞歸調(diào)用
  4. 基準數(shù)的歸位

對應(yīng)處理:

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

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

  • 如果 基準數(shù)選取的為arr[low] , 那么必須先從高位high查找到小于pivot的數(shù),然后再從低位low尋找大于pivot的數(shù),交換;
  • 如果 基準數(shù)選取的為arr[high] , 那么必須先從低位low查找到大于pivot的數(shù),然后再從高位high尋找小于pivot的數(shù),交換;

原因是, 當兩側(cè)的查找相遇時候,需要將基準數(shù)pivot 和相遇點元素的值交換以正確歸位基準數(shù)pivot; 也就是pivot = arr[low] 這種情況 相遇點的元素值必須要小于pivot的值,如果先從低位low查找大于pivot的元素,最終停止的元素大于pivot的話 就會導致歸位失??;

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

    /* 快速排序 */
    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);
    }

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

圖片.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • quicksort可以說是應(yīng)用最廣泛的排序算法之一,它的基本思想是分治法,選擇一個pivot(中軸點),將小于pi...
    黎景陽閱讀 546評論 0 1
  • 算法的個人理解: 基于分治思想,將復(fù)雜的問題簡單化;具體的做法是在待排序的數(shù)組中,選取一個基準數(shù),這個基準數(shù)...
    開開心心美滋滋閱讀 508評論 0 0
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,297評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,819評論 0 15
  • 《討鬼傳極》單挑快速火方法的視頻演示及全面分析 內(nèi)容概述: 1.視頻中:游戲版本為1.00,任務(wù)為十三章單獨任務(wù),...
    光明神話閱讀 1,072評論 0 0

友情鏈接更多精彩內(nèi)容