回顧Quick Sort(Javascript 實現)

Introduction

QuickSort的時間複雜度漸近函數雖然不能達到MergeSort般的O(nlgn),但因其良好的時間常量以及平均運行時間而被普遍使用。
下圖解釋了QuickSort的過程。
函數

做爲一種典型的分治法,QuickSort選取某一特殊點做爲支點(pivot),並根據目標區域元素大小較於支點做爲從新分配元素位置的基準,以此爲分。而不斷再遍歷支點兩邊的區域,做爲治。ui

First Implementation

根據分治法的原理圖形,因而有了下面的第一個實現。code

function QuickSort(array, bottomIndex, topIndex){
    if(bottomIndex >= topIndex) {
        return
    }
    
    var middleIndex = Arrange(array, bottomIndex, topIndex)
    QuickSort(array, bottomIndex, middleIndex - 1)
    QuickSort(array, middleIndex + 1, topIndex)
  }


  function Arrange(array, bottomIndex, topIndex){
    var middleIndex = topIndex
    var rightMostValue = array[middleIndex]
    
    var length = topIndex - bottomIndex + 1
    var valuesLowerThanPivot = []
    var valuesHigherThanPivot = []
    //Do not compare itself, that's why minus 1
    for(var i = 0; i < length - 1; i++) {
        if(array[bottomIndex + i] <= rightMostValue) {
            valuesLowerThanPivot.push(array[bottomIndex + i])
      }else {
        valuesHigherThanPivot.push(array[bottomIndex + i])
      }
    }
    
    var length = valuesLowerThanPivot.length
    for(var i = 0; i < length; i++) {
        array[bottomIndex + i] =  valuesLowerThanPivot[i]
    }
    middleIndex = bottomIndex + length
    array[middleIndex] = rightMostValue
    var length = valuesHigherThanPivot.length
    for(var i = 0; i < length; i++) {
        array[middleIndex + 1 + i] =  valuesHigherThanPivot[i]
    }
    return middleIndex
  }

  //testCase
  var array = [1, 3, 8, 9, 2, 4, 6, 19, 88, 77, 11]

  QuickSort(array, 0, array.length - 1)
  //The result should be [1, 2, 3, 4, 6, 8, 9, 11, 19, 77, 88]
  console.log(array)

功能是實現了,可是代碼還能夠改進不少,咱們能夠將目標區域分組化。
blog

Second Implementation

function QuickSort(array, bottomIndex, topIndex){
    if(bottomIndex >= topIndex) {
        return
    }
    
    var middleIndex = Arrange(array, bottomIndex, topIndex)
    QuickSort(array, bottomIndex, middleIndex - 1)
    QuickSort(array, middleIndex + 1, topIndex)
  }

  function swapElements(array, indexA, indexB){
    var temp = array[indexA]
    array[indexA] = array[indexB]
    array[indexB] = temp
  }

  function Arrange(array, bottomIndex, topIndex){
    var rightMostValue = array[topIndex]
    
    var length = topIndex - bottomIndex
    var lGroupIndex = 0
    for(var i = 0; i < length; i++){ 
        if(array[bottomIndex + i] < rightMostValue){
        swapElements(array, bottomIndex + lGroupIndex++, bottomIndex + i)
      }
    }
    
    swapElements(array, bottomIndex + lGroupIndex, topIndex)
    return bottomIndex + lGroupIndex
  }

  //testCase
  var array = [1, 3, 8, 9, 2, 4, 6, 19, 88, 77, 11]
  QuickSort(array, 0, array.length - 1)
  //The result should be [1, 2, 3, 4, 6, 8, 9, 11, 19, 77, 88]
  console.log(array)

是否是好多啦 :)it

相關文章
相關標籤/搜索