1.9.1 快速排序
顧名思義快速排序聽起來雖然有點像概念性的東西,但是名字就代表了它本身。設想一個這樣的場景:如果在你面前有一羣剛出生不久生病的小狗狗,都有自己的掛號單,現在給你的任務就是按照單號給小狗排序,因爲時間問題,所以要去無論什麼辦法,只要最快就行。這個時候也許快速排序能幫上你的忙!
1.9.2 核心
- 在排序之前選擇一個值爲遊標(中間值)
- 所有小於遊標的放在左側,大於遊標的放在右側
- 左右兩邊分開的數據不斷重複第一步、第二步,
直到裏面只有一個值爲止
假設剛剛狗狗的單號是這樣子的
- 第一步選擇8作爲中間值(選擇任何值都行,中間比較容易明白)
- 所有小於8的放在左側,大於8的放在右側
- 左右兩邊分開的數據不斷重複第一步、第二步,直到裏面只有一個值爲止
1.9.3 使用javascript實現
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
</body>
<script>
const AR = {
arr: [3, 4, 6, 1, 2, 0, 8, 9, 5, 7, 22, 88, 23],
//快速排序
quickSort(arr) {
//直到分爲單個時返回當前排好序的數組
if (arr.length <= 1) return arr;
// 獲取前數組的中間值下標
const cursor = Math.floor(arr.length / 2);
// 獲取數組的中間值
const [crrent, ] = arr.splice(cursor, 1);
// 左邊的數組
const leftArr = [];
// 右邊的數組
const rightArr = [];
// 以中間值爲遊標大的放右邊小的放左邊
arr.forEach(e => {
if (e < crrent) {
leftArr.push(e)
} else {
rightArr.push(e)
}
});
// 遞歸重複這個步驟最後就可以得到排好序的數組
return AR.quickSort(leftArr).concat([crrent], AR.quickSort(rightArr))
},
}
console.dir(AR.quickSort(AR.arr));
</script>
</html>
使用的時候直接調用就行了
1.9.4 快速排序思維導圖
小狗很快就拍好序了:)好吧,你可能會受不了,可能會狗帶,畢竟和電腦比不了,具體情況具體分析,當數據量很大的時候。這種方式是最爲廣泛也是最快的。