回顾Quick Sort(Javascript 实现)
Introduction
QuickSort的时间复杂度渐近函数虽然不能达到MergeSort般的O(nlgn),但因其良好的时间常量以及平均运行时间而被广泛使用。
下图解释了QuickSort的过程。
作为一种典型的分治法,QuickSort选取某一特殊点作为支点(pivot),并根据目标区域元素大小较于支点作为重新分配元素位置的基准,以此为分。而不断再遍历支点两边的区域,作为治。
First 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 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)
功能是实现了,但是代码还可以改进很多,我们可以将目标区域分组化。
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)
是不是好多啦 😃