前言:本文主要是用JavaScript实现数据结构中的各种排序算法,例如:插入排序
、希尔排序、合并排序等。

冒泡排序


  1. function bubbleSort(arr) {
  2. console.time("冒泡排序")var num = 0;
  3. for (var i = arr.length; i > num; num++) {
  4. for (var j = i - 1; j > num; j--) {
  5. if(arr[j-1]>arr[j]){
  6. var temp = arr[j-1];
  7. arr[j-1] = arr[j];
  8. arr[j] = temp;
  9. }
  10. }
  11. }
  12. console.timeEnd("冒泡排序")
  13. return arr
  14. }
  15. var arr = [12, 290, 219, 278, 4432,21, 43, 89, 78];
  16. console.log( bubbleSort(arr));

时间复杂度: 最差 O(n2) ; 最优 O(n)

插入排序


插入排序的基本原理如下图:从前向后构建有序序列,对于未排序序列,在已排序的序列中从后向前扫描插入位置,对于第p个元素,需要扫描p-1次,平均来说插入排序算法复杂度为O(n2)

  1. function insertSort(arr) {
  2. console.time("插入排序")
  3.  
  4. var len = arr.length;
  5.  
  6. if (len <= 1) {
  7. return arr;
  8. }
  9.  
  10. // 1~n-1趟排序
  11. arr.map(function(item,index){
  12. if(index>0){
  13. for (var j = index; j > 0 && arr[j - 1] > item; j--) {
  14. arr[j] = arr[j - 1];
  15. }
  16. arr[j] = item;
  17. }
  18. });
  19. console.timeEnd("插入排序")
  20. return arr
  21. }
  22. var arr = [12, 290, 219, 278, 4432, 21, 43, 89, 78];
  23. console.log(insertSort(arr));

希尔排序


shell排序也称为递减增量排序,效果比插入排序更好,对于不同的增量,排序性能也不同

下面我们看看 步长选择为并且对步长取半直到步长达到1的算法实现。

  1. function shellSort(arr) {
  2. console.time("希尔排序")
  3. var gap, i, j;
  4. var temp;
  5. for (gap = arr.length >> 1; gap > 0; gap >>= 1)
  6. for (i = gap; i < arr.length; i++) {
  7. temp = arr[i];
  8. for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
  9. arr[j + gap] = arr[j];
  10. arr[j + gap] = temp;
  11. }
  12. console.timeEnd("希尔排序")
  13. return arr
  14. }
  15. var arr = [12, 290, 219, 278, 4432, 21, 43, 89, 78];
  16. console.log(shellSort(arr));

算法实现过程如下:这里我们选择 步长为4:(每一列相当于一次插入排序)

  1. 12 190 219 278
  2. 4432 21 43 89
  3. 78
  4. // 第一次排序之后得到:
  5. 12 21 43 89
  6. 78 190 219 278
  7. 4432
  8.  
  9. // 连接起来得到的是 [12,21,43,89,78,190,219,278,4432],接着以2为步长 排序之后变为:
  10. 12 21
  11. 43 89
  12. 78 190
  13. 219 278
  14. 4432
  15.  
  16. // 然后就是简单的插入排序

平均时间复杂度为: 

快速排序


  快排的思想也很简单,以升序为例,在序列中选一标杆,一般讲第一个元素作为标杆,然后将序列中比标杆小的元素放到标杆左边,将比标杆大的放到标杆右边。然后分别在左右两边重复这样的操作。

  快速排序的关键在于选取中心枢纽povit,该值可以随机选择,但是不同的选择会有所影响,在这里我直接选择了最左端的元素

  1. void ksort(int a[], int l, int r) {
  2. // 长度小于2有序
  3. if (r - l < 2) return;
  4. int start = l, end = r;
  5. while (l < r) {
  6. // 向右去找到第一个比标杆大的数
  7. while (++l < end && a[l] <= a[start]);
  8. // 向左去找第一个比标杆小的数9 while(--r > start && a[r] >= a[start]);
  9. if (l < r) swap(a[l], a[r]); // 前面找到的两个数相对于标杆逆序 ,需交换过来 。l==r 不需要交换,
  10. }
  11. swap(a[start], a[r]); // 将标杆挪到正确的位置.
  12. // 对标杆左右两边重复算法,注意,这个l已经跑到r后面去了
  13. ksort(a, start, r);
  14. ksort(a, l, end);
  15. }

快速排序实现2: (以中间的为基准值)

  1. function qSort(arr) {
  2. if (arr.length <= 1) {
  3. return arr;
  4. }
  5. var num = Math.floor(arr.length / 2);
  6.  
  7. var numValue = arr.splice(num, 1)[0];
  8. var left = [],
  9. right = [];
  10. for (var i = 0; i < arr.length; i++) {
  11. if (arr[i] < numValue) {
  12. left.push(arr[i]);
  13. } else {
  14. right.push(arr[i]);
  15. }
  16. }
  17. return qSort(left)
  18. .concat([numValue], qSort(right))
  19. }
  20.  
  21. console.log(qSort([32, 45, 37, 16, 2, 87]))

快速排序的平均时间复杂度为O(NLogN)

合并排序

合并排序采用分治法的思想对数组进行分治,对半分开,分别对左右两边进行排序,然后将排序后的结果进行合并。按照这样的思想,递归做是最方便的。

  1. int a[N], c[N];
  2. void mergeSort(l, r) {
  3. int mid, i, j, tmp;
  4. if (r - 1 > l) {
  5. mid = (l + r) >> 1;
  6. // 分别最左右两天排序
  7. mergeSort(l, mid);
  8. mergeSort(mid, r);
  9. // 合并排序后的数组
  10. tmp = l;
  11. for (i = l, j = mid; i < mid && j < r;) {
  12. if (a[i] > a[j]) c[tmp++] = a[j++];
  13. else c[tmp++] = a[i++];
  14. }
  15. // 把剩余的接上
  16. if (j < r) {
  17. for (; j < r; j++) c[tmp++] = a[j];
  18. } else {
  19. for (; i < mid; i++) c[tmp++] = a[i];
  20. }
  21. // 将c数组覆盖到a里
  22. for (i = l; i < r; i++) {
  23. a[i] = c[i];
  24. }
  25. }
  26. }

结束语

  更新几种排序算法的实现

JavaScript实现各种排序算法的更多相关文章

  1. javascript 中合并排序算法 详解

    javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: <script type="text/javascript& ...

  2. 用javascript实现简单排序算法

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 本文为楼主自己的学习记录文章,若有不当之处请斧正. 本文主要记录排序算法 [冒泡排序] 感觉这个是最简单的排序算法了.直接引用维基百科里的 ...

  3. JavaScript数据结构-2.排序算法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. JavaScript实现常见排序算法

    列表 冒泡排序 选择排序 插入排序 快速排序 希尔排序 归并排序 冒泡排序 // 输入:[5, 6, 3, 4, 8, 0, 1, 4, 7] // 输出:[0, 1, 3, 4, 4, 5, 6, ...

  5. JavaScript 常用的排序算法

    冒泡排序 function bubbleSort(array) { for (let i = 0; i < array.length; i++) for (let j = 0; j < a ...

  6. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  7. 十大经典排序算法总结(JavaScript描述)

    前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...

  8. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...

  9. 转载部长一篇大作:常用排序算法之JavaScript实现

    转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...

随机推荐

  1. UVA - 10462-Is There A Second Way Left? Kruskal求次小生成树

    UVA - 10462 题意: 求次小生成树的模板题,这道题因为有重边的存在,所以用kruskal求比较好. #include <iostream> #include <cstdio ...

  2. 电脑修改密码后,git push 报错unable to access

    电脑修改密码后,git push 时报错 remote: Permission to xxx A. fatal: unable to access  解决这个问题有两种方法,一种是界面修改,一种是命令 ...

  3. buuctf 随便注 writeup

    1.0 打开页面 显然这个题的考点是注入,那我们来测一下 2.0 sql注入测试 1 2 输入 1' 后发现没有回显,改为 1' --+ 后,有回显,应该在这存在注入点 试一下 1' and 1=1 ...

  4. IP地址和int互转

    /** * @author: yqq * @date: 2019/5/8 * @description: ip地址与int之间互换 * https://mp.weixin.qq.com/s?__biz ...

  5. Markdown 直接转换公众号文章,不再为排版花时间

    上一篇「又一家数据公司被查,爬虫到底做错了什么?」反响强烈,虽然我这是新号,但还是获得了不少公众号的转发,借机也结识了很多业内大佬,在此感谢大家的抬爱! 同时也有不少号主问我的文章排版是用的哪个网站, ...

  6. 内部类实例化Serializable

    昨天在做一个java项目的时候,发现下面代码中红色字体那行总是报NotSerializableException,查错误,MyRectangle这个类也明明实现了Serializable接口. 花了大 ...

  7. Python连载38-协程、可迭代、迭代器、生产者消费者模型

    一.生产者消费者模型 import multiprocessing from time import ctime def consumer(input_q): print("Into con ...

  8. 设置IntelliJ IDEA支持lambda表达式

    使用IntelliJ IDEA做为开发工具,对基于maven的java工程,如果要编写lambda表达式,先确保安装并使用了jdk1.8或者更高版本,然后再要做一些设置才能正常编译和执行,具体表现在m ...

  9. PHPCon 2019 第七届 PHP 开发者大会总结

    往届回顾-2018:PHPCon 2018链接: https://pan.baidu.com/s/17nfrfqk9K4vwKPAsjBVW7A——提取码:rjbr 随着PHP7的诞生,兼顾了高性能和 ...

  10. charles 端口转发

    本文参考:charles 端口转发 端口转发 端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH) 为网络安全通信使用的一种方法.端口转发是转发一个网络端口从一个网络节点到另 ...