js实现各种排序总结
2016-09-05 17:20
337 查看
1.冒泡排序
冒泡排序是最普通的一种排序了,也是时间复杂度最高的,排序过程如下图:
代码如下:
2.选择排序
选择排序的本质就是每次循环中找到本次循环的最小值的位置minIndex,然后判断minIndex是否为本次循环的开头第一个位置,如果不是,交换两个值。如图:
代码如下:
3.插入排序
插入排序思想是,规定第一个值已经排序,然后判断第二项的值是否大于第一项的值,然后换位,接下来判断第三项的值与前两项值得比较,依此类推,如图:
代码如下:
4.归并排序
其思想是将原始数组切分成较小的数组,直到每个小数组只有一
个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组,如图:
代码如下:
5.快速排序
(1) 首先,从数组中选择中间一项作为主元。
(2) 创建两个指针,左边一个指向数组第一个项,右边一个指向数组最后一个项。移动左指
针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素,然后交
换它们,重复这个过程,直到左指针超过了右指针。这个过程将使得比主元小的值都排在主元之
前,而比主元大的值都排在主元之后。这一步叫作划分操作。
(3) 接着,算法对划分后的小数组(较主元小的值组成的子数组,以及较主元大的值组成的
子数组)重复之前的两个步骤,直至数组已完全排序。
代码如下:
还有二分排序,计数排序,堆排序,突然发现排序算法有这么多……………..
各位看官,点这里哟
冒泡排序是最普通的一种排序了,也是时间复杂度最高的,排序过程如下图:
代码如下:
var sortData = function(data){ var length = data.length; for (var i=0; i<length; i++){ for(var j=0; j<length-i-1; j++){ if(data[j]>data[j+1]){ var index = data[j]; data[j] = data[j+1]; data[j+1] = index; } } } return data; }
2.选择排序
选择排序的本质就是每次循环中找到本次循环的最小值的位置minIndex,然后判断minIndex是否为本次循环的开头第一个位置,如果不是,交换两个值。如图:
代码如下:
var selectionSort = function(data){ var length = data.length, indexMin; for(var i=0;i<length;i++){ indexMin = i; for(var j=i;j<length;j++){ if(data[indexMin] > data[j]){ indexMin = j; } } if(i !== indexMin){ var index = data[i]; data[i] = data[indexMin]; data[indexMin] = index; } } return data; }
3.插入排序
插入排序思想是,规定第一个值已经排序,然后判断第二项的值是否大于第一项的值,然后换位,接下来判断第三项的值与前两项值得比较,依此类推,如图:
代码如下:
var insertSort = function(data){ var length = data.length, j, temp; for(var i=1;i<length;i++){ j = i; temp = data[i]; while(j>0 && data[j-1]>temp){ data[j]=data[j-1]; j--; } data[j] = temp; } return data; }
4.归并排序
其思想是将原始数组切分成较小的数组,直到每个小数组只有一
个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组,如图:
代码如下:
var mergeSort = function(data){ var length = data.length; if(length === 1){ return data; } var mid = Math.floor(length / 2), left = data.slice(0, mid), right = data.slice(mid, length); return merge(mergeSort(left), mergeSort(right)); } var merge = function(left, right){ var result = [], il = 0, ir = 0; while(il<left.length && ir <right.length){ if(left[il] <right[ir]){ result.push(left[il++]); } else{ result.push(right[ir++]); } } while(il<left.length){ result.push(left[il++]); } while(ir<right.length){ result.push(right[ir++]); } return result; }
5.快速排序
(1) 首先,从数组中选择中间一项作为主元。
(2) 创建两个指针,左边一个指向数组第一个项,右边一个指向数组最后一个项。移动左指
针直到我们找到一个比主元大的元素,接着,移动右指针直到找到一个比主元小的元素,然后交
换它们,重复这个过程,直到左指针超过了右指针。这个过程将使得比主元小的值都排在主元之
前,而比主元大的值都排在主元之后。这一步叫作划分操作。
(3) 接着,算法对划分后的小数组(较主元小的值组成的子数组,以及较主元大的值组成的
子数组)重复之前的两个步骤,直至数组已完全排序。
代码如下:
var quickSort = function(data){ if(data.length<=1) return data; var pivotIndex = Math.floor(data.length/2); var pivot = data.splice(pivotIndex, 1)[0]; var left=[],right=[]; for(var i=0;i<data.length;i++){ if(data[i]<pivot){ left.push(data[i]) }else{ right.push(data[i]) } } return quickSort(left).concat([pivot],quickSort(right)); }
还有二分排序,计数排序,堆排序,突然发现排序算法有这么多……………..
各位看官,点这里哟
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- 在命令行用 sort 进行排序
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 设计模式---状态模式在web前端中的应用
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法