QuickSort的時間複雜度漸近函數雖然不能達到MergeSort般的O(nlgn),但因其良好的時間常量以及平均運行時間而被普遍使用。
下圖解釋了QuickSort的過程。
函數
做爲一種典型的分治法,QuickSort選取某一特殊點做爲支點(pivot),並根據目標區域元素大小較於支點做爲從新分配元素位置的基準,以此爲分。而不斷再遍歷支點兩邊的區域,做爲治。ui
根據分治法的原理圖形,因而有了下面的第一個實現。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
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