回顾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). 重新排序数列,所有元素比基 ...
随机推荐
- C语言文件读写总结
主要有四种: 1.文件的字符输入输出函数 fgetc fputc2.文件的字符串输入输出函数 fgets fputs3.文件的格式化输入输出函数 fscanf fprintf4.文件的数据块输入输出函 ...
- 51nod1674:区间的价值2(分治,利用&和|的收敛性)
lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值为7,这个区间对答案的贡献为2 ...
- Mysql数据库--语句整理/提升/进阶/高级使用技巧
一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...
- 获取当前正在运行的activity
adb shell dumpsys activity activities | findstr "Run"
- 微信小程序 实现websocket长连接 以及断开连接之后自动重连
app.js let socketMsgQueue = [] let isLoading = false App({ globalData: { userInfo: null, localSocket ...
- 获取access_token时却报出下列错误信息:{"errcode":40164,"errmsg":"invalid ip 61.172.68.219, not in whitelist hint: [KJZfAa0644e575]"},以及一些其他报错
获取access_token时却报出下列错误信息:{"errcode":40164,"errmsg":"invalid ip 61.172.68.21 ...
- Numbers Exchange
题意: Eugeny有n张卡片,他希望和Nikolay交换一些卡片使得他拥有的奇数数字和偶数数字的卡片数目一样,且所有数字都不同. Nikolay有m张卡片,分别写着1到m.问最少交换几次,能够满足要 ...
- mysql添加DATETIME类型字段导致Invalid default value错误的问题
例如: CREATE TABLE foo ( `creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP, `modification_time` DATET ...
- TP5之发送邮件
1.下载扩展,vendor\phpmailer 文件结构: 2.话不多说,上代码 注意点: · 需要提前开通对应邮箱的SMTP服务 · $mail->Host = " & ...
- HDU 3501【欧拉函数拓展】
欧拉函数 欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . 通式:φ(x)=x*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)-..(1- ...