排序思路
① 若陣列長度為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]