關於js快速排序的總結

快速排序的思想是:隨機選取一箇中間值,遍歷數組,將數組中比這個數小的放在這個數左邊,將數組中比這個數大的放在右邊,直至該數組排序完成。

關於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
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章