JavaScript快速排序(quickSort)算法的實現(xiàn)方法總結(jié)
什么是快速排序?
快速排序的思想式 分治法。選一個基準(zhǔn)點,然后根據(jù)大小進行分配,分配然完畢之后,對已經(jīng)分配的進行遞歸操作,最終形成快速排序。所以遞歸也是快速排序思想的一個重要組成部分。
基本思路
- 基準(zhǔn)點: 選中基準(zhǔn)點,一般選擇數(shù)組第一項,當(dāng)然也可以隨機或者指定數(shù)據(jù)。
- 分區(qū),一般分為
less/greater或者left/right - 遞歸: 對已有的分區(qū)經(jīng)進行遞歸操作
- 合并:將已有的數(shù)據(jù)進行合并
寫法一:基礎(chǔ)寫法
function quickSort(arr) {
// 數(shù)組小于 1 不用排序,直接返回即可
if(arr.length <= 1) {
return arr;
}
const p = arr[0]; // 選定數(shù)組第一個為基準(zhǔn)點
const left = []; // 左分區(qū)
const right = []; // 右分區(qū)
// 遍歷給左右分區(qū)
for(let i = 1; i < arr.length; i++) {
if(arr[i] < p) {
// 小于基準(zhǔn)點放在左邊
left.push(arr[i])
}else {
// 大于基準(zhǔn)點方在右邊
right.push(arr[i])
}
}
// 合一并且對左右分區(qū),遞歸處理
return quickSort(left).concat(p, quickSort(right))
}
寫法二: 函數(shù)式
function quickSort(arr) {
if (arr.length <= 1) {
return arr;
} else {
const p = arr[0]; // 確定中間值
const left = arr.slice(1).filter(x => x <= p);
const right = arr.slice(1).filter(x => x > p);
return quickSort(left).concat(p, quickSort(right))
}
}
使用 filter 過濾,偏向函數(shù)式編程,寫的代碼更加簡潔。
寫法三:隨機基準(zhǔn)值
function randomizeQuickSort(arr) {
if (arr.length <= 1) {
return arr;
} else {
const pi = Math.floor(Math.random() * arr.length); // 隨機基準(zhǔn)值索引
const p = arr[pi];
const left = arr.slice(0, pi).concat(arr.slice(pi + 1).filter(x => x <= p));
const right = arr.slice(pi + 1).filter(x => x > p);
return randomizeQuickSort(left).concat(p, randomizeQuickSort(right))
}
}
隨機獲取基準(zhǔn)值索引,根據(jù)隨機索引獲基準(zhǔn)值,所有這兩個已知的值,就可以制作一個隨機索引快速排序了。
寫法四:三分法
function threeWayQuickSort(arr) {
if (arr.length <= 1) {
return arr;
} else {
const p = arr[0];
const left = arr.filter(x => x < p);
const mid = arr.filter(x => x === p); // 獲取所有的中間值,避免重復(fù)計算
const right = arr.filter(x => x > p);
return threeWayQuickSort(left).concat(mid, threeWayQuickSort(right))
}
}
三路法,將二路基礎(chǔ)上,將自己看成一個中間數(shù)組,因為與自己相等的可能有很多。這樣就避免了在其他數(shù)組中,還有中間數(shù)據(jù)的重復(fù)比較, 一種快速排序的優(yōu)化。
排序算法的使用場景
- 大規(guī)模數(shù)據(jù)排序速度,比其他的算法要快
復(fù)雜度分析
- 快速排序的平均時間復(fù)雜度是
O(n log n)這種復(fù)雜度是比較理想的。O(n log n)來源是劃分 O(n)和遞歸 O(log n)的組合。
更難展望
- 雙軸快速排序
- 尾遞歸優(yōu)化
小結(jié)
文本主要講解常用算法中的快速排序的算法, 快速排序的思想很簡單,就是分與合配合遞歸的思想。選定一個基準(zhǔn)值,然后進行對比分離,遞歸這個操作,然后重新配合在一起。當(dāng)然排序算法也是可以根據(jù)自己的需求進行優(yōu)化的。
相關(guān)文章
easyui tree帶checkbox實現(xiàn)單選的簡單實例
下面小編就為大家?guī)硪黄猠asyui tree帶checkbox實現(xiàn)單選的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
使用snowfall.jquery.js實現(xiàn)愛心滿屏飛的效果
這篇文章主要介紹了使用snowfall.jquery.js實現(xiàn)愛心滿屏飛的效果的相關(guān)資料,需要的朋友可以參考下2017-01-01

