回顾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)
是不是好多啦
回顾Quick Sort(Javascript 实现)的更多相关文章
- 【算法】快速排序(Quick Sort)(六)
快速排序(Quick Sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- quick sort 的简化实现
Pivot 随机选取意义不大 第一种方法使用随机pivot,使得尽可能平均二分序列,而实际上一般来说需要排序的集合往往是乱序的,无需重新生成随机数作为pivot,大可使用固定位置的数作为pivot,这 ...
- 1101. Quick Sort (25)
There is a classical process named partition in the famous quick sort algorithm. In this process we ...
- [算法] 快速排序 Quick Sort
快速排序(Quick Sort)使用分治法策略. 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分:其中一部分的所有数据都比另外一部分的所有数据都要小.然后,再按此方法对这 ...
- 基础排序算法之快速排序(Quick Sort)
快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...
- 快速排序(Quick Sort)的C语言实现
快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序,具体步骤 ...
- Quick Sort In-place Implementation
在线运行PHP http://www.compileonline.com/execute_php_online.php <?php function swap( &$a, &$b ...
- 快速排序(Quick Sort)
快速排序是初学者比较难理解的几个算法之一,这里尽可简单化地讲解,希望能帮到大家. 快速排序基本步骤: 从数列中挑出一个元素,称为"基准"(pivot). 重新排序数列,所有元素比基 ...
随机推荐
- hdu 6058
\(f(l,r,k)=\)区间[\(l\),\(r\)]的第k大. \(\sum_{l=1}^{n}{\sum_{r=l}^{n}{f(l,r,k)}}\) 参考题解,claris大佬题解.赛后AC. ...
- git解决冲突方式
Git解决冲突 安装beyond compare 4 2.配置git对比工具 #difftool 配置 git config --global diff.tool bc4 git config --g ...
- Ubuntu18.04 安装 JDK7
直接下载jdk压缩包方式安装 1.官网下载JDK 地址: http://www.oracle.com/technetwork/articles/javase/index-jsp-138363 ...
- ARM、DSP、FPGA的技术特点和区别
在嵌入式开发领域,ARM是一款非常受欢迎的微处理器,其市场覆盖率极高,DSP和FPGA则是作为嵌入式开发的协处理器,协助微处理器更好的实现产品功能. 那三者的技术特点以及区别是什么呢?下文就此问题略做 ...
- 通过url在两个页面之间传值
今天开发遇到一个需要通过url传值才能解决的问题,就查了一下资料 一下是整理的结果: 假如需要把a页面的值传到b页面 a页面代码 <script type="text/javascri ...
- iOS 中 常用的第三方库
现在对于我们 iOS 开发来说,基本上说不可能不使用第三方轮子啦,毕竟没那么多时间,而且自己造的轮子往往想着成为上图中的最后一个,结果却成了上图中第二个或第一个啦,当然大公司另当别论.下面我从之前用过 ...
- CodeForces 41A+43A【课上无聊刷水题系列】
41Acode 好像只要前一个字符串存在下一个字符串的头单词就YES: #include <bits/stdc++.h> using namespace std; typedef __in ...
- WPF 设置 Label.MouseDoubleClickEvent
facLabel.AddHandler(Label.MouseDoubleClickEvent, new MouseButtonEventHandler((o, a) => { facLabel ...
- JS实现购物车动态功能
整理了一下当时学js写的一些案例,觉得购物车功能在一般网站比较常见且基础,现在把它整理出来,需要的小伙伴可以参考一下. 该案例购物车主要功能如下: 1. 商品单选.全选.反选功能 2. 商品添加.删除 ...
- XHTML学习笔记 Part3:核心属性
1. 3个属性组: 核心属性:class.id 和title属性 国际化属性:dir.lang和xml:lang属性 UI事件:与如下事件关联的属性: onclick.ondoubleclick.on ...