回顾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

相关文章
相关标签/搜索