排序算法主要用在元素的数组排序,常见的排序算法有冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序等。这些排序算法都可以用JavaScript实现。下面的排序算法都假设是从小到大进行排序,从大到小可以相应进行转化。

冒泡排序

冒泡排序的基本思想是从头遍历要排序的数组,比较相邻两个数,如果前面位置的数大于后面位置的数,那么就将两者进行交换,否则不做任何操作。遍历完一次之后,最大的数就放到了数组最后的位置。然后再从头遍历数组,进行同样的操作,就可以将第二大的数放到倒数第二个位置,依此进行下去,直到所有数都排好位置为止。冒泡排序的代码实现如下:

functon bubbleSort(arr) {for (var i = 0; i < arr.length-1; i++) {for (var j = 0; j < arr.length-1-i; j++) {if (arr[j] > arr[j+1]) {// 交换位置var temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}return arr;}
}

冒泡排序平均时间复杂度为O(n^2),而且是一种稳定的排序算法。

选择排序

选择排序的基本思想是先找到数组中最小的元素,将它和数组的第一个元素交换位置,再找到数组中第二小的元素,将它和数组的第二个元素交换位置,依次进行下去,直到整个数组排好序为止。选择排序代码实现如下:

functon selectSort(arr) {for (var i = 0; i < arr.length-1; i++) {var min = arr[i];for (var j = i+1; j < len; j++) {if (arr[j] < min) {var temp = min;min = arr[j];arr[j] = temp;}arr[i] = min;}}return arr;
}

选择排序的时间复杂度为O(n^2),而且是一个不稳定的排序算法。

插入排序

插入排序的基本思想是将一个记录(数)插入到已排好序的有序数列中的适当位置。插入排序的代码实现如下:

function insertSort(arr) {for (var i = 1; i < arr.length; i++) {var key = arr[i];for (var j = i-1; j >= 0; j--) {if (arr[j] > key) {arr[j + 1] = arr[j];} else {arr[j + 1] = key;}}}return arr;
}

插入排序的时间复杂度为O(n^2),而且是一个稳定的排序算法。

希尔排序

希尔排序又称“缩小增量排序”,是在直接插入排序算法上进行改进的,它的基本思想是先将整个待排序序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。因为插入排序在对几乎已经排好序的数据操作时,效率高。 希尔排序的步骤是:首先取一个小于序列长度的整数d1作为增量,对序列从头开始把所有距离为d的元素放在同一个分组中,现在各组内进行直接插入排序;然后去第二个增量d2(小于d1),进行同样的操作,直到增量为1,即对已经基本有序的序列进行插入排序。希尔排序代码实现如下:

function shellSort(arr, dk) {for (var d = dk/2; d > 0; d /= 2) {for (var j = d; j < n; j++) {if (arr[j] < arr[j-d]) {var temp = arr[j];var k = j - d;while (k >= 0 && arr[k] > temp) {arr[k + d] = arr[k];k -= d;}arr[k + d] = temp;}}}
}

希尔排序的时间复杂度为O(n^3/2),而且是一个不稳定的排序算法。

快速排序

快速排序是一种分而治之的算法,它是冒泡排序的改进,基本思想是通过一趟排序将待排序列分割成独立的两部分,其中一部分的值都要比另一部分的值小,再分别对这两部分继续进行排序,直到整个序列有序。 快速排序的步骤是:首先从序列中选择一个基准元素,假设为第一个元素,将列表分成两部分,将所有小于基准值的元素放在基准值前面,所有大于基准值的元素放在基准值后面,再分别对这两部分重复上面的步骤即可。代码首先如下:

// key为基准值序号
function quickSort(arr) {if (arr.length <= 1) {return arr;} else {var low = [];var high = [];var pivotkey = arr[0];for (var i = 1; i < arr.length; i++) {if (arr[i] <= pivotkey) {low.push(arr[i]);} else {high.push(arr[i]);}}}return quickSort(low).concat(pivotkey, quickSort(high));
}

快速排序的时间复杂度为O(nlogn),而且是一个不稳定的排序算法。

归并排序

归并的含义是将两个或两个以上的有序表组合成一个新的有序表。假设初始序列长度为n,首先,每个子序列的长度为1,然后前后两两归并。得到若干个长度为2或者1的子序列,再两两归并,如此重复,直至得到一个长度为n的的有序序列为止。

原文链接 http://hyuhan.com/2017/03/02/sorting-with-javascript/#归并排序

JavaScript实现排序算法相关推荐

  1. JavaScript的排序算法——快速排序

    排序算法(Sorting algorithm)是计算机科学最古老.最基本的课题之一.要想成为合格的程序员,就必须理解和掌握各种排序算法. 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排 ...

  2. javascript常用排序算法总结

    算法是程序的灵魂.虽然在前端的开发环境中排序算法不是很经常用到,但常见的排序算法还是应该要掌握的.我在这里从网上整理了一下常见排序算法的javascript实现,方便以后查阅. 归并排序: 1 fun ...

  3. JavaScript之排序算法

    本文主要介绍三种排序算法,分别是冒泡排序.选择排序和快速排序.为方便测试,本文会随机生成长度为10的数组,数组元素的值在[1,20]之间. 1.冒泡排序 核心思路:每一轮相邻两个数进行比较,选出一个最 ...

  4. JavaScript随机排序算法1

    1.对数组循环,每一项与随机的某一项位置调换 <ul id="listOne"></ul><div id="tempOne"> ...

  5. JavaScript实现排序算法(1)——冒泡排序

    冒泡排序 冒泡排序的核心思路,就是每一轮都把最大的数"冒"到数组顶部. 1 算法过程 (从小到大排序) 1. 每一轮排序,都从第一个数开始,比较相邻的数; 2. 如果第一个数比第二 ...

  6. javascript写各种排序算法

    在知乎上看到这个题目,就自己写了一下,在这里附上链接,里面有各种排序的动态图,非常形象直观,有助于新手对排序算法理解,链接:常见排序算法之JavaScript实现 首先各种排序算法都会用到的交换函数: ...

  7. JavaScript实现十种经典排序算法(js排序算法)

    冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...

  8. JavaScript实现ShellSort希尔排序算法(附完整源码)

    JavaScript实现ShellSort希尔排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 ShellSort.js完整源代码 Comparator.js完整 ...

  9. JavaScript实现SelectionSort选择排序算法(附完整源码)

    JavaScript实现SelectionSort选择排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 SelectionSort.js完整源代码 Compara ...

最新文章

  1. 两阶段提交实际项目V1
  2. 项目: 用Easyx绘制围棋和象棋的棋盘
  3. Python基础入门:endswith() 函数
  4. OPENCV-2 学习笔记
  5. hdu 4493 Tutor (水 精度)
  6. Day-5: Python高级特性
  7. 用dw(dreamweaver)开发asp.net,连接数据库时出现“http错误500,服务器内部错误”的解决方法...
  8. ubuntu 16.04 apache 开启Rewrite功能
  9. 计算高斯混合模型的可分性和重叠度(Overlap Rate, OLR)
  10. 最好的计划是略有闲余的计划,用于缓冲必然出现的错误与突发事件(转)
  11. 计算机考研408的优势和劣势,21考研:杭州电子科技大学计算机改考408!透露2个信号,咋整?...
  12. mysql dump 导出表_误删库,别跑路!教你一招MySQL 数据恢复
  13. oracle手注,oracle手注
  14. 【二叉树】牛客网:二叉树的镜像
  15. Center OS7网络设置
  16. 光纤中的非线性光学效应
  17. 数学建模——时间序列预测(股价预测)
  18. [渝粤教育] 无锡商业职业技术学院 团队管理 参考 资料
  19. 我进了培训机构,成为一名java讲师
  20. 邓应海:美通胀见顶迹象令美联储缩表时点蒙阴?日内最新黄金走势分析

热门文章

  1. c++ 3.变量定义
  2. mysql int 补零_mysql int(11)字段左边自动补零了
  3. kl散度度量分布_论“邻里关系”的学问:度量和改进图信息在图神经网络中的使用 | AI Time PhD ICLR...
  4. Tomcat中部署后JspFactory报异常的解决方案
  5. oracle中如何插入
  6. 如何查看自己Oracle的版本
  7. 【C#】VS2017 winform 打包
  8. python-IDE的使用(小白先看)
  9. 常用netbeans快捷键
  10. IEDA中彻底删除项目