性能要比快速排序还要快上很多倍的桶排序
来源:互联网 发布:php extension 编辑:程序博客网 时间:2024/05/29 04:35
本文标签: 桶排序快速排序
桶排序可以说得上是最简单的排序算法了,但是它的使用范围非常狭窄,不过不可否认的是在其适用范围内,它的性能要比快速排序还要快上很多倍。
没错,桶排序也是一种非比较型排序算法,这也正是它能够超越快速排序的原因。
桶排序主要有以下缺陷:
- 参与排序的数组存放的必须是整数。
- 数组中的最大数和最小数保持在一个合理的间距内。
- 需要额外的内存空间。
下面将通过一个例子讲解桶排序的核心思想:
假如说我们需要对全国高考语文成绩进行排序,由于总分只有 150 分,而且所有的值都在 [0, 150] 之间,所以我们可以申请一个大小为 151 的辅助数组。
1
2
3
4
5
var countArray= [];
for(vari =0;i <=150;i++){
countArray[i]= 0;
}
首先我们将数组的值都置为 0。然后我们以各考生的成绩为下标递增辅助数组的值。比如说一个考生成绩为 90,那么我们就让 countArray[90]++
,这样一直运算下去,直到所有的考生成绩都被遍历完,我们就可以统计出来每个分数有多少考生,然后再将辅助数组中的值复制回原数组,整个数组自然而然就有序了!
实现
大概了解了桶排序的思想,下面就来实现一下,假说某年参加高考的学生共有 500 万人,我们对其语文成绩进行排序。
下面是排序代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function countSort(array,k){
varlength = array.length,
countArray= [],
i;
for (i= 0;i <k;i++){
countArray[i]= 0;
}
for (i= 0;i <length;i++){
countArray[array[i]]++;
}
varz =0;
for (i= 0;i <k;i++){
while (countArray[i]--> 0){
array[z++]= i;
}
}
}
下面是测试代码:
1
2
3
4
5
6
7
8
9
10
11
vararray = [];
for(vari =0;i <5000000;i++){
array.push(Math.floor(Math.random()* 151));
}
console.time();
countSort(array,151);
console.timeEnd();
console.log(array);
以上代码在我电脑上的运行时间在 23ms 左右,可见,桶排序排序 500万数据的速度是如此之快,而我用快速排序对同一个数组进行排序,花了 320 ms 左右。
所以,如果在合适的时机选择计数排序,将节省很多时间。
改进
看了以上代码也许你发现了,上述代码如果排序一个数值在 [10000, 10200] 范围内的数组的话,将申请大量的内存,为了节省内存,我们不得不改进这个算法,让其适应指定范围内排序。
很简单的,我们可以在方法中设置一个 low 和 max 参数,就可以灵活自如了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function countSort(array,low,max){
varlength = array.length,
countArray= [],
i,
k= max- low+ 1;
for (i= 0;i <k;i++){
countArray[i]= 0;
}
for (i= 0;i <length;i++){
countArray[array[i]- low]++;
}
varz =0;
for (i= 0;i <k;i++){
while (countArray[i]--> 0){
array[z++]= i+ low;
}
}
console.log(countArray.length);
}
总结
最近一直在学习排序算法,发现比较型算法虽然速度比较慢一些(比较型算法的下限是 O(NlogN)),但是适用范围很广。非比较型算法虽然使用范围很有限,但是其速度非常之快。所以在选择排序算法时,根据程序的数值类型以及范围,首先要考虑是否能够使用非比较型算法,如果不可以再选用比较型算法,比如快速排序。
写在最后:FOR Freedom 看看外边的世界,以及IT这一行,少不了去Google查资料,最后,安利一个加速器代理。一枝红杏 加速器,去Google查资料是绝对首选,连接速度快,使用也方便。我买的是99¥一年的,通过这个链接(http://my.yizhihongxing.com/aff.php?aff=2509)注册后输上优惠码wh80,终身85折 ,平摊下来,每月才7块钱,特实惠。
本文标签: 桶排序快速排序 Web系统主流架构 搭建Web系统架构缓存服务器数据库架构 技术型初创公司 互联网杂谈
转自 SUN'S BLOG - 专注互联网知识,分享互联网精神!
原文地址: 《性能要比快速排序还要快上很多倍的桶排序》
相关阅读:《Aaron Swartz – 互联网天才开挂的人生历程:每时每刻都问自己,现在这世界有什么最重要的事是我能参与去做的?》
相关阅读:《网站环境apache + php + mysql 的XAMPP,如何实现一个服务器上配置多个网站?》相关阅读:《什么是工程师文化?各位工程师是为什么活的?作为一个IT或互联网公司为什么要工程师文化?》
相关阅读: 对程序员有用:2017最新能上Google的hosts文件下载及总结网友遇到的各种hosts问题解决方法及配置详解
相关BLOG:SUN’S BLOG- 专注互联网知识,分享互联网精神!去看看:www.whosmall.com
原文地址:http://whosmall.com/?post=329
- 性能要比快速排序还要快上很多倍的桶排序
- 归并排序比冒泡排序快上好多倍
- 比冒泡快不知道多少倍的快速排序
- 快速排序的性能分析
- 快速排序的性能分析
- 两种排序算法 插入排序 和冒泡排序:插入排序要比冒泡快2倍以上
- 比快速排序还快的排序算法
- 为什么快速排序比堆排序要快?
- 为什么快速排序比堆排序要快?
- 传说中比冒泡排序快很多的排序方法(vb)
- 为什么Nginx的性能要比Apache高很多?
- 为什么Nginx的性能要比Apache高很多?
- 为什么Nginx的性能要比Apache高很多?
- 为什么Nginx的性能要比Apache高很多?
- 为什么 Nginx 的性能要比 Apache 高很多?
- 为什么Nginx的性能要比Apache高很多?
- 为什么Nginx的性能要比Apache高很多?
- 为什么Nginx的性能要比Apache高很多?
- Medium:Clone Graph
- 面向对象的特征有哪些方面
- Java 多线程 并发编程
- 【Java NIO的深入研究】 ServerSocketChannel
- 自定义View实现炫酷进度条
- 性能要比快速排序还要快上很多倍的桶排序
- 蛇皮走位填数(蛇形填数)——记一道有点意思的ACM题
- spark之MLlib机器学习-线性回归
- 3.19
- hive中UDTF编写和使用(转)
- Semaphore创建字符串池
- (蓝桥杯练习)2.猜算式
- 编程练习1
- Android笔记:浅析Android电视APP开发