相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法。

一.冒泡排序

说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放在前面;

如 var arr = [7, 3, 10, 1, 8, 4, 2, 4, 4, 3] 进行升序排列,排序过程如下

第一次 [3, 7, 1, 8, 4, 2, 4, 4, 3, 10]

第二次 [3, 1, 7, 4, 2, 4, 4, 3, 8, 10]

以此类推 。。。。

结果 [1, 2, 3, 3, 4, 4, 4, 7, 8, 10];

//冒泡排序
function bubbleSort(arr){
var len = arr.length,t
for(j=0;j<=len-1;j++){
for(i=0;i<=len-j-1;i++){
if(arr[i]>arr[i+1]){
t = arr[i+1];
arr[i+1] = arr[i];
arr[i] = t;
}
}
}
return arr;
}

二.快速排序

快速排序也是我们常用到的一种排序方式,核心步骤如下

1.选择中间数。

2.构建两个临时数组,比中间数小的放到左边,大的放到右边

3.对临时数组重复1-2;

例如,我们原始数组为[2,4,1,5,6,3,12,9,7],第一步我们选择第5项 6 为中间数,创建临时数组left,right,则left 结果为[2,4,1,5,3],right 结果为 [12,9,7]。然后再分别对left和right进行相同的操作,直至left及right数组长度为1.

具体代码如下:

//快速排序
function quickSort(arr){
if(arr.length <= 1){ //数组长度为1时,则停止递归
return arr
}
var l = Math.floor(arr.length/2); //选择中间数
var left = [],right=[];
var splitEle = arr.splice(l,1)[0] //将中间数从原数组删除并保存
for(i=0;i<arr.length;i++){
if(arr[i] < splitEle){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
return arguments.callee(left).concat(splitEle,arguments.callee(right))
}

三.选择排序

选择排序核心思想如下:

加入我们进行升序排列,我们假设数组第一项为最小值,然后将第一项与其他项分别比较,如果其他项小于第一项,则交换位置,这样第一次循环结束我们可以保证第一项为最小值。然后第二项做类似操作,然后以此类推,具体如下图所示

代码如下:

//选择排序
function selectQuot(arr){
for(i=0; i<arr.length-1; i++){
for(j=i+1;j<arr.length;j++){
if(arr[i] > arr[j]){
var temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr
}

四.插入排序

插入排序很好理解,首先我们取出第一项放入一个虚构的数组,然后取第二项,假如第二项小于第一项,则将第二项放于第一项的前面,否则放在后面;然后取第三项,分别与前两项进行比较(是不是有点儿类似打扑克牌~~)

如我们的数组为[2, 4, 1, 5, 3, 8 ,7 ,9 , 6];

假定我们有一个虚拟数组,则第一步数组为[2],然后我们取数组的第二项,发现要比刚才取得数组项大,则我们放在后面即虚拟数组变成[2,4],然后取下一项与虚拟数组中的项分别比较,按上述思路结果为[1,2,4],以此类推……当然在实际编程中我们并不需要单独创建数组。

代码如下:

//插入排序
function insertSort(arr){
for(i=1 ; i<arr.length ; i++ ){
var temp = arr[i],
j = i - 1;
while(j>=0 && temp < arr[j]){
arr[j+1] = arr[j]; //相当于将虚拟数组当前项后移一位,同时虚拟数组长度+1
j--;
}
arr[j+1] = temp; //新加项最终插入的位置
}
return arr;
}

五.希尔排序

希尔排序是插入排序的升级版,又称为缩小增量排序。

对于插入排序算法来说,如果原来的数据就是有序的,那么数据就不需要移动,基于此,希尔排序首先将数组按照一定间隔分为若干个小数组分别进行插入排序,然后逐渐减小间隔,直至为1,这样最后一次处理即间隔为1的排序,但由于之前的操作后数组基本变为有序数组,这样就能提高些效率。示意如下:

我们原始数组为[3, 4, 6, 5, 1, 9, 6, 10, 8, 8]

第一步我们假设增量为3,按照希尔排序思路我们将数组如下分割

我们每一次将同样的分组赋予同一颜色,然后对每一分组进行插入排序,空白颜色为结果。

实现代码如下:

//希尔排序
function shellSort(array) {
var len = array.length;
var gap = len;
do {
gap = Math.floor(gap/3)+1; // 减小增量
// 把距离为gap的元素编为一个组,扫描所有组
for (var i = gap; i < len; i++) {
var temp = array[i],
j = i - gap;
while(j>=0 && temp < array[j]){
array[j + gap] = array[j];
j -= gap;
}
array[j+gap] = temp;
}
}while(gap > 1)
return array
}

六.归并排序

归并排序的核心思想是,首先将数组分成若干个子数组变成有序数组,再合并有序数组。

具体流程盗用网络上一张图,一看便知

代码如下:

var mergeSort = {
splitArr : function(arr){
if(arr.length == 1) return arr;
var mid = Math.floor(arr.length/2),
left = arr.slice(0,mid),
right = arr.slice(mid);
return this.merge(this.splitArr(left),this.splitArr(right))
},
merge : function(left , right){
var result = [];
while(left.length > 0 && right.length > 0){
if(left[0] < right[0]){
result.push(left.shift())
}else{
result.push(right.shift())
}
}
return result.concat(left).concat(right)
}
}

如果您觉得文章对您有帮助,请帮忙点击右下角的推荐,文中不足之处也欢迎指出以便及时改正

js排序算法总结——冒泡,快速,选择,插入,希尔,归并的更多相关文章

  1. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  2. php 冒泡 快速 选择 插入算法 四种基本算法

    php四种基础算法:冒泡,选择,插入和快速排序法 来源:PHP100中文网 | 时间:2013-10-29 15:24:57 | 阅读数:120854 [导读] 许多人都说 算法是程序的核心,一个程序 ...

  3. js排序算法总结—冒泡,快速,选择,插入,希尔,归并

    相信排序是任何一个程序猿都会用到的东西,今天简单总结记录下常见的排序算法. 一.冒泡排序 说起冒泡排序,可能每个人都不会陌生,实现思路相当简单明了,就是不停的对数组进行两两比较,将较大(较小)的一项放 ...

  4. Java排序算法之冒泡、选择、插入、快速

    JavaSort Java经典排序算法代码 2018-1-26更新:冒泡排序,选择排序,插入排序,快速排序 1. 冒泡排序 特点:效率低,实现简单 思想(从小到大排): 第1个数和第2个数比较,如果第 ...

  5. python排序算法之冒泡,选择,插入

    1.参考 一本关于排序算法的 GitBook 在线书籍 <十大经典排序算法>,使用 JavaScript & Python & Go 实现 2.冒泡排序:两两比较,互换位置 ...

  6. 排序算法(冒泡,选择,快速)Java 实现

    冒泡 排序: public static void Bubblesort(int [] a) { for(int x=0;x<=a.length-1;x++) { for(int y=0;y&l ...

  7. 排序算法(冒泡、选择)-python代码展示

    冒泡排序: def bubble_sort(list): for i in range(len(list) - 1): # 这个循环负责设置冒泡排序进行的次数 for j in range(len(l ...

  8. Shell数组以及排序算法(冒泡、直接选择、反转)

    Shell数组以及排序算法(冒泡.直接选择.反转) 目录 Shell数组以及排序算法(冒泡.直接选择.反转) 一.数组概述 1. 数组的定义 2. 下标的定义 3. 数组的特点 4. 数组定义的方法 ...

  9. 总结下js排序算法和乱序算法

    其实本人最怕的就是算法,大学算法课就感觉老师在讲天书,而且对于前端来说,算法在实际的应用中实在是很有限.毕竟算法要依靠大量的数据为基础才能发挥出算法的效率,就浏览器那性能,......是吧,退一万步说 ...

随机推荐

  1. jquery 中jsonp的实现原理

    在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,即一般的 ajax是不能进行跨域请求的.但 img.iframe .script等标签是个例外,这些标签可以通过 src属性请求到其 ...

  2. composer 报错:Your requirements could not be resolved to an installable set of packages 解决方法

    composer 报错: - Your requirements could not be resolved to an installable set of packages xxxxxxxxxxx ...

  3. scrapy加载cookies登陆

    import scrapy from xxxx.items import XXXXItem from scrapy.http.request import Request class ZndsSpid ...

  4. leveldb 性能、使用场景评估

    最近有个业务写远远大于读,读也集中在最近写入,这不很适合采用leveldb存储么,leveldb业界貌似ssdb用得挺广,花了两天时间就ssdb简单做下测试,以下总结. ssdb 是leveldb的r ...

  5. rsa密钥文件转化为tortoise认可的pak密钥文件

    原贴地址: http://www.vectorns.com/blog/technical-articles/1-tortoisesvn-over-ssh-on-windows-via-putty Ne ...

  6. QL Server 2008 所有账号丢失sysadmin权限,sa账号亦没有开启,该如何解决??

    1. 用Run as a administrator打开命令提示符里输入NET STOP MSSQLSERVER, 即停止MSSQLSERVER运行. 2. 在命令提示符里输入 NET START M ...

  7. WebSocket介绍和一个简单的聊天室

    WebSocket是什么呢? WebSocket一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范, ...

  8. MVC之Model转Json

    在开发中,有时我们需要在View层中拿到Model返回的数据并且是一个Json对象,那么我们就可以利用Newtonsoft.Json.JsonConvert.SerializeObject(Model ...

  9. Linux中杀不死的进程

    前段时间,一哥们,去杀Linux服务器的进程,发现kill命令失灵了,怎么杀都杀不死. 然后上网查了下资料,原来是要被杀的进程,成为了僵尸进程. 僵尸进程的查看方法: 利用命令ps,可以看到有标记为Z ...

  10. JavaScript常用字符串操作方法总结

    1.判断是否为字符串:typeof() var str = 'abcd'; typeof(str);   //string 2.获取字符串的长度:length var str = '123456789 ...