JavaScript的排序算法
零、写在最前
排序的方法有很多种,这篇文章只是记录我熟悉的算法;
我发现了一个关于排序算法很有趣的网站,把相关的算法演示做成了动画,有兴趣的同学可以看看!
附上SortAnimate网站链接:http://jun-lu.github.io/SortAnimate/index.html
一、冒泡排序
这是一种最基础的排序算法,也就是入门级别的算法!
原理:两两检测,比较两者之间的大小关系,大的往后丢!
1 function bubbleSort(arr){ 2 for(var i=0;i<arr.length;i++){ 3 for(var j=0;i<arr.length-i-1;i++){ 4 if(arr[j]>arr[j+1]){ 5 var temp=arr[j+1]; 6 arr[j+1]=arr[j]; 7 arr[j]=temp; 8 } 9 } 10 } 11 return arr; 12 }
二、快速排序
常用、排序速度快,但有点浪费内存空间!
原理:以中间基准点为中心进行比较,小的放左,大的放右,需要另外的2个数组存放;
1 function quickSort(arr){ 2 if (arr.length <= 1) { return arr; } 3 var index=Math.floor(arr.length/2); 4 var center=arr.splice(index,1)[0]; 5 var left=[],right=[]; 6 for(var i=0;i<arr.length;i++){ 7 arr[i]<center ? left.push(arr[i]) : right.push(arr[i]); 8 } 9 return quickSort(left).concat([center],quickSort(right)); 10 }
三、插入排序
原理:逐个检测,最大的往最后丢,每次减少检测次数!
1 function insertSort(arr){ 2 var arrLen=arr.length; 3 for(var i=0;i<arrLen;i++){ 4 var index=0; 5 for(var j=1;j<arrLen-i;j++){ 6 if(arr[j]>arr[index]) index=j; 7 } 8 var temp=arr[arrLen-i-1]; 9 arr[arrLen-i-1]=arr[index]; 10 arr[index]=temp; 11 } 12 return arr; 13 }
四、归并排序 (2019/03/14补充)
算法原理简单说就是拆分与合并的过程;
拆分:反复一拆为二,直到独立为一个为止 (中间有个递归的过程,数据量大会遭遇溢出)
合并:向上回溯,做到有序排列
代码如下:
(function () {//例子:let arr = [2,5,4,6,9,111,0,8,1];function mergeFn(left, right) {//合并let tem = [];while (left.length > 0 && right.length > 0) {if (left[0] < right[0]) {tem.push(left.shift());} else {tem.push(right.shift());}}return tem.concat(left, right); //返回最终的数组结果 }function slitFn(data) {//拆分let dataLen = data.length;if (dataLen === 1) {return data;}let midNum = Math.floor(dataLen / 2); //获取中间下标let leftData = data.slice(0, midNum);let rightData = data.slice(midNum);return mergeFn(slitFn(leftData), slitFn(rightData));}console.log(slitFn(arr));})()
PS:具体分析或者是数据溢出处理可以参考 韩子迟的博客
五、选择排序 (2019/5/13补充)
选择排序是一种简单直观的排序算法;
原理: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 ; 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾; 以此类推,直到所有元素均排序完毕。
function selectionSort (arr) {var len = arr.length;var minIndex, temp;for (var i = 0; i < len-1; i++) {minIndex = i;for (var j = i+1; j < len; j++) {if (arr[j] < arr[minIndex]) {minIndex = j}}temp = arr[minIndex]arr[minIndex] = arr[i]arr[i] = temp}return arr } var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]; selectionSort(arr)
六、结尾
排序算法还有 选择排序、希尔排序、二分排序等等.......
选择算法还需要考虑时间复杂度、稳定性、数据重复量多少;
我以后再学习,再来补充这篇文章!
-------------------- End ---------------------
转载于:https://www.cnblogs.com/anniey/p/6641057.html
JavaScript的排序算法相关推荐
- JavaScript的排序算法——快速排序
排序算法(Sorting algorithm)是计算机科学最古老.最基本的课题之一.要想成为合格的程序员,就必须理解和掌握各种排序算法. 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排 ...
- javascript常用排序算法总结
算法是程序的灵魂.虽然在前端的开发环境中排序算法不是很经常用到,但常见的排序算法还是应该要掌握的.我在这里从网上整理了一下常见排序算法的javascript实现,方便以后查阅. 归并排序: 1 fun ...
- JavaScript实现排序算法
排序算法主要用在元素的数组排序,常见的排序算法有冒泡排序.选择排序.插入排序.希尔排序.快速排序.归并排序等.这些排序算法都可以用JavaScript实现.下面的排序算法都假设是从小到大进行排序,从大 ...
- JavaScript之排序算法
本文主要介绍三种排序算法,分别是冒泡排序.选择排序和快速排序.为方便测试,本文会随机生成长度为10的数组,数组元素的值在[1,20]之间. 1.冒泡排序 核心思路:每一轮相邻两个数进行比较,选出一个最 ...
- JavaScript随机排序算法1
1.对数组循环,每一项与随机的某一项位置调换 <ul id="listOne"></ul><div id="tempOne"> ...
- JavaScript实现排序算法(1)——冒泡排序
冒泡排序 冒泡排序的核心思路,就是每一轮都把最大的数"冒"到数组顶部. 1 算法过程 (从小到大排序) 1. 每一轮排序,都从第一个数开始,比较相邻的数; 2. 如果第一个数比第二 ...
- javascript写各种排序算法
在知乎上看到这个题目,就自己写了一下,在这里附上链接,里面有各种排序的动态图,非常形象直观,有助于新手对排序算法理解,链接:常见排序算法之JavaScript实现 首先各种排序算法都会用到的交换函数: ...
- JavaScript实现十种经典排序算法(js排序算法)
冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...
- JavaScript实现ShellSort希尔排序算法(附完整源码)
JavaScript实现ShellSort希尔排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 ShellSort.js完整源代码 Comparator.js完整 ...
- JavaScript实现SelectionSort选择排序算法(附完整源码)
JavaScript实现SelectionSort选择排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 SelectionSort.js完整源代码 Compara ...
最新文章
- 2013第51周二eclipse启动优化
- android mina分析,Android与Mina整合
- 【转】The password supplied with the username Domain\UserName was not correct. AD密码定期更换
- java 使用 new Date() 和 System.currentTimeMillis() 获取当前 时间戳
- Java Calendar toString()方法与示例
- 解析取值_圆锥曲线——高中解析几何全归纳
- Stateflow_报错记录
- mm和mmm编译说明
- 腾达W308r改64M内存8M闪存CPU加散热片,刷磊科NR235W/NR236W的软件
- sim868 c++二次开发基本完成
- yyyy-MM-dd 转化成 中国标准时间(Tue Dec 31 2019 00:00:00 GMT+0800 (中国标准时间))
- WEB测试番外之----XSS攻击
- 徐闻县珊瑚礁保护区可持续发展策略
- 路由器重温——ISIS路由-2
- lstm和GRU结构图
- ubuntu18.04 快速搭建 Hyperledger Fabric超级账本框架
- 阿里内部发布最新版Java进阶笔记,金九银十看这份文档就够了
- 求n的阶乘,求1~n的阶乘和(循环)
- 【十八掌●基本功篇】第一掌:Java之IO
- blender中文三维立体文字制作方法