快速排序的思想是:隨機選取一箇中間值,遍歷數組,將數組中比這個數小的放在這個數左邊,將數組中比這個數大的放在右邊,直至該數組排序完成。
關於js的快速排序思路主要有兩種:
第一種:遞歸思想,使用兩個數組對左右兩邊的小數和大數分別進行儲存,但是該方法比較浪費內存資源
代碼如下:
let qSort = (arr) => {
let quickSort = (arr) => {
let len = arr.length
if(len<2){//當數組長度小於2時結束遞歸
return arr
}else{
let flag = arr[0]//默認選取arr[0]爲flag值
let left = []//存儲左邊的數
let right = []//存儲右邊的數
for(let i = 1;i<len;i++){
let tmp = arr[i]
if(tmp<flag){
left.push(tmp)
}else{
right.push(tmp)
}
}
return quickSort(left).concat(flag,quickSort(right))//進行遞歸,並將左右數組和flag標誌數進行拼接
}
}
return quickSort(arr)
}
第二種,依然是遞歸思想,但是不創建新數組,使用遊標對原數組進行分割
let quickSort = (arr) => {
let swap = (arr, i, j) => {
let num = arr[i]
arr[i] = arr[j]
arr[j] = num
}
let quick = (arr, left, right)=>{//left表示劃分片段中,最左邊的數座標;right同理
let flag = arr[left]
let idx = left+1
for(let i=idx;i<=right;i++){
if(arr[i]<flag){
swap(arr,idx,i)
idx++
}
}
swap(arr,left,idx-1)//將所有比flag小的數放在左邊
return idx
}
let sort = (arr, left, right)=>{
if(left<right){
let center = quick(arr, left, right)
sort(arr,0,center-1)//遞歸
sort(arr,center,right)//遞歸
}
}
sort(arr,0,arr.length-1)
return arr
}