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)

是不是好多啦

回顾Quick Sort(Javascript 实现)的更多相关文章

  1. 【算法】快速排序(Quick Sort)(六)

    快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...

  2. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

  3. quick sort 的简化实现

    Pivot 随机选取意义不大 第一种方法使用随机pivot,使得尽可能平均二分序列,而实际上一般来说需要排序的集合往往是乱序的,无需重新生成随机数作为pivot,大可使用固定位置的数作为pivot,这 ...

  4. 1101. Quick Sort (25)

    There is a classical process named partition in the famous quick sort algorithm. In this process we ...

  5. [算法] 快速排序 Quick Sort

    快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...

  6. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  7. 快速排序(Quick Sort)的C语言实现

    快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序,具体步骤 ...

  8. Quick Sort In-place Implementation

    在线运行PHP http://www.compileonline.com/execute_php_online.php <?php function swap( &$a, &$b ...

  9. 快速排序(Quick Sort)

    快速排序是初学者比较难理解的几个算法之一,这里尽可简单化地讲解,希望能帮到大家. 快速排序基本步骤: 从数列中挑出一个元素,称为"基准"(pivot). 重新排序数列,所有元素比基 ...

随机推荐

  1. Opencv— — mix channels

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  2. 多线程之:synchonized锁实现的原理<一>

    一:java同步的锁类型? --->目前在Java中存在两种锁机制:synchonized和Lock--->Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug ...

  3. java.lang.NoSuchMethodException: com.sun.proxy.$Proxy

    删掉了@Transactional注解,结果成功了 是这个注解造成的. 是ssh2的整合强制我们使用分层架构.

  4. SQL Server中查询CPU占用高的SQL语句

    SQL Server中查询CPU占用高的情况,会用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests 一.查看当前的数据库用户连接有多少 USE ...

  5. python 去停用词

    Try caching the stopwords object, as shown below. Constructing this each time you call the function ...

  6. js正则匹配字符串

    这里我第一时间想到的就是用 js 的search 和 match ,其中最常见的是match: 1. str.search(regexp):search()方法不支持全局搜索,因为会忽略正则表达式参数 ...

  7. u盘启动安装系统

    七彩虹主板如何设置U盘启动,本文就以七彩虹CG41主板为例详细的讲讲U盘启动设置方法. 几天前,想用U盘启动的时候,发现CG41主板启动顺序里找不到USB项,Boot Device Priority( ...

  8. 推荐 BI Work

    推荐阅读 BI Work 的文章,作为学习用 http://www.cnblogs.com/biwork

  9. C# 外界调用方法是 方法名是string类型的解决方法

  10. You Are the One

    题意: 有n个人排队,第i个入场的人x的不愉快度是$D_x*(i-1)$,现在给你n个人在队伍中的位置, 你可以用一个栈让一个人后面的人先进入,问最小的不愉快度是多少. 解法: 考虑注意到用栈调整次序 ...