排序演算法——快速排序

鴨脖發表於2013-05-05

排序思路

① 若陣列長度為0/1,直接返回結果,否則從陣列中間取一個數字作為基準值
② 將陣列從左到右分成三份 第一份中的數字小於基準值,第二份是基準值,第三份中數字大於基準值
③ 對第一份和第三份中的數字遞迴重複步驟①②,返回三份陣列拼接起來的結果
 
以對陣列[8,6,5,9,4,3]排序為例,畫了個簡圖:

javascript實現

/**
 * 思路:在陣列中間取一個數字作為基準值,大於基準值的數字放到右邊子陣列,
 * 小於基準值的數字放到左邊子陣列,拼接起來即得到最終結果
 * @param arr
 */
function quickSort(arr){
    //判斷引數是否合法
    if(!(arr instanceof  Array)) return [];
    if(arr.length<=1) return arr;
    //定義基準值、左邊陣列、右邊陣列,並從原陣列中去除基準值
    var jizhun=arr.splice(Math.floor(arr.length/2),1),
        left=[],
        right=[];
    //遍歷去除基準值後的原陣列
    arr.forEach(function(n){
        n<jizhun?left.push(n):right.push(n);
    });
    //對左右陣列分別快速排序,並返回結果
    return quickSort(left).concat(jizhun,quickSort(right));
}

例如輸入陣列[5,4,1,3,2] 

分解動作如下:

step1   基準值為1  ,分解結果 [],[1],[5,4,3,2]

step2   右側陣列,基準值為3,分解結果  [2],[3],[5,4]

step3   右側陣列,基準值為5 ,分解結果 [4],[5],[]

step4   假設三部分陣列的名字分別為  left  jz  right ,則

result=left1+jz1+right1

right1= left2+jz2+right2

right2=left3+jz3+right3

所以result=left1+jz1+left2+jz2+left3+jz3+right3

結果是  [1,2,3,4,5]

相關文章