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. webpack 错误心得

    使用webpack 打包项目已经有很长一段时间了,在使用过程中也碰到各种恶样的坑,常见的错误,当然也有少见的错误,今天写这篇文章主要是想分享找出错误和解决错误的方法. 而不是分享具体的错误例子,因为实 ...

  2. Ubuntu16.04 安装cuda9.0 cudnn 7.0.5

    参考网址:https://blog.csdn.net/zhuangwu116/article/details/81063234 (1)下载安装文件: 下载cuda9.0 runfile 文件 下载地址 ...

  3. 回味经典——uboot1.1.6 之 第二阶段 第三阶段

    转自:http://blog.csdn.net/lizuobin2/article/details/52061530 上篇文章说到,再清 BSS 段之后,CPU 跳转到 sdram 里的 start_ ...

  4. 关于layer.open() 弹框的使用

    在用 layer.open() 追加渲染HTML的时候,完全看不到效果,皆因layui框架需要在最后用 form.render() 方法来渲染表单才可以看到效果,写法如下: <script> ...

  5. layui 复选框checkbox 全选写法

    前语:本来我是不想写layui框架的博客的,有的时候数据经过layui渲染后原生的写法就取不到值了,一定要用它框架的写法,实在蛋疼,故写之,以后用到可以省点时间去度娘! HTML: <div i ...

  6. World is Exploding

    题意: 给出一个长为n的序列A,问有多少四元组(a, b, c, d)满足$a \ne b \ne c \ne d, 1 \leq a < b \leq n, 1 \leq c < d \ ...

  7. docker三剑客之一docker compose

    compose有两个重要的概念: 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker- ...

  8. 【eclipse插件开发实战】Eclipse插件开发4——插件JDE、PDE开发方式及plugin.xml配置文件结构

    Eclipse插件开发4--插件JDE.PDE开发方式及plugin.xml配置文件结构 开发方式分为:java开发环境JDE开发插件的方式和插件开发环境PDE开发插件方式. 插件通过添加到预定义的扩 ...

  9. 无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。

    原文链接:http://blog.csdn.net/byondocean/article/details/7564502 session是工作在你的应用程序进程中的.asp.net进程.iis往往会在 ...

  10. Codeforces325 D【并查集维护连通性】

    参考:大牛blog 思路: 因为是环,所以可以复制一下图,先判断一下和他是不是和与他相邻的8个之一的一个障碍使得构成了一个环,环就是一个连通,用并查集维护即可: 如果没有就ans++,然后并把这个点加 ...