今天有個朋友問快速排序的原理,用processon給他畫了一個圖,也順手貼上來,給需要的朋友使用。
快排的核心原理是:
1,選數組中的中間數據爲比較的基數 (其實選哪個都可以,選第一個或者最後一個都行)
2,從頭開始遍歷數組,跟選出來的中間數進行比較,比中間數小的放左邊數組,大的放右邊數組
3,此時得到leftArr數組、中間元素、右邊數組
4,分別對左邊數組執行步驟1~3,直到拆不出數組位置。
5,最後會把拆出來的元素都連起來。
直接上一個流程圖,希望一圖能勝千言哈:
直接擼代碼(Javascript):
var originalArr = [12,23,16,14,12,21,7];
function quickSort(arr) {
// 只有一個元素的時候就不用排了,直接返回,需要一直拆解到只有一個元素
if(arr.length<=1){
return arr;
}
// 拿到中間元素
const middleIndex = Math.floor(arr.length/2);
const middleValue = arr.splice(middleIndex,1)[0]; // 把計劃做中間數據的元素拿出來
let left = [];
let right = [];
// 跟別跟中間元素進行大小比較
for(let i=0;i<arr.length;i++){
if(arr[i]<=middleValue){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
// 這一步是關鍵,需要遞歸的處理
return quickSort(left).concat(middleValue,quickSort(right));
}
let newArr = quickSort( [...originalArr] );
console.log(`quickSort end, newArr = ${JSON.stringify(newArr)}`);
// 結果: quickSort end, newArr = [7,12,12,14,16,21,23]