数据结构中的各种排序方法小结(JS实现)


Posted in Javascript onJuly 23, 2016

新技术一直在不断变化,掌握一些基础是未来学习不断更新的技术的坚实基础。近来闲来无事,为了温习一下从前学的数据结构,将数据结构中的排序算法用JS实现了一遍,并在本文末尾处嵌入了DEMO。

简单排序

冒泡排序

冒泡排序是最简单排序算法,时间复杂度为n的平方,代码如下:

function bubbleSort(array) {
      for (var i = 0; i < array.length; i++) {
        for (var j = array.length; j > 0; j--) {
          if (array[j] < array[j - 1]) {
            var temp = array[j - 1];
            array[j - 1] = array[j];
            array[j] = temp;
          }

        }
        /* 输出结果 */
        document.write("这是第 + (i + 1) + "次循环·,结果为:");
        for (var k = 0; k < array.length; k++) {
          document.write(array[k] + ",");
        }
        document.write("<br />");
        /* 输出结果结束 */
      }
    }

直接插入排序

直接插入排序也属于简单排序算法,时间复杂度也为n的平方,但性能略好于冒泡排序,代码如下:

function insertSort(array) {
      var temp;
      for (var i = 1; i < array.length; i++) {
        var temp = array[i];
        for (var j = i; j > 0 && temp < array[j - 1]; j--) {
          array[j] = array[j - 1];
        }
        array[j] = temp
        /* 输出结果 */
        document.write("第? + i + "遍排序的结果是:")
        for (var n = 0; n < array.length; n++) {
          document.write(array[n] + ",");
        }

        document.write("<br />")
        /* 输出结果结束 */

      }
    }

选择排序

选择排序也属于简单排序算法,时间复杂度也为n的平方,性能同样略微好于冒泡排序,代码如下:

function selectSort(array) {
      var min, temp; ;
      for (var i = 0; i < array.length; i++) {
        min = i;
        for (var j = i + 1; j < array.length; j++) {
          if (array[min] > array[j])
            min = j;
        }
        if (min != i) {
          temp = array[i];
          array[i] = array[min];
          array[min] = temp;
        }
        /* 输出结果 */
        document.write("第 + i + "遍排序的结果是:")
        for (var n = 0; n < array.length; n++) {
          document.write(array[n] + ",");
        }

        document.write("<br />")
        /* 输出结果结束 */

      }
    }

复杂排序

希尔排序

希尔排序是插入排序的升级,1959年希尔通过将简单排序中两两比较改为设置步长跳跃式比较而突破了n的平方的时间复杂度,希尔排序根据步长的不同时间复杂度由最好的nlogn到最坏的n的平方。代码如下:

function shallSort(array) {
      var increment = array.length;
      var i
      var temp; //暂存
      var count = 0;
      do {
        increment = Math.floor(increment / 3) + 1;
        for (i = increment; i < array.length; i++) {
          if (array[i] < array[i - increment]) {
            temp = array[i];
            for (var j = i - increment; j > 0 && temp < array[j]; j -= increment) {

              array[j + increment] = array[j];

            }
            array[j + increment] = temp;
            /* 输出结果 */
            count++;
            document.write("<br />第 + count + "遍排序的结果是:")
            for (var n = 0; n < array.length; n++) {
              document.write(array[n] + ",");
            }
            /* 输出结果结束 */
          }
        }
      }
      while (increment > 1)

    }

堆排序

堆排序是选择排序的升级,通过不断构建大顶堆或者小顶堆来选择最大或者最小的值放入队列前端进行排序,堆排序任何情况下的时间复杂度都为nlogn,代码如下:

function heapSort(array) {
      var temp;
      var i;
      for (i = Math.floor(array.length / 2); i >= 0; i--) {
        heapAdjust(array, i, array.length - 1); //将数组array构建成一个大顶堆
      }
      for (i = array.length - 1; i >= 0; i--) {
        /*把根节点交换出去*/
        temp = array[i];
        array[i] = array[0];
        array[0] = temp;

        /*余下的数组继续构建成大顶堆*/
        heapAdjust(array, 0, i - 1);
        /* 输出结果 */
        document.write("<br />第 + (array.length - i).toString() + "遍排序的结果是:")
        for (var n = 0; n < array.length; n++) {
          document.write(array[n] + ",");
        }
        /* 输出结果结束 */
      }
    }
    //要调整的子树
    //start为数组开始下标
    //max是数组结束下标
    function heapAdjust(array, start, max) {
      var temp, j;
      temp = array[start];//temp是根节点的值
      for (j = 2 * start; j < max; j *= 2) {
        if (j < max && array[j] < array[j + 1]) { //取得较大孩子的下标
          ++j;

        }
        if (temp >= array[j])
          break;
        array[start] = array[j];
        start = j;
      }
      array[start] = temp;

    }

归并排序

归并排序是复杂排序中唯一一个稳定排序,通过将待排序数组进行分拆再合并来进行排序,归并排序时间复杂度为n的平方,代码如下:

//source源数组    //dest目标数组
    //s起始下标
    //t目标下标
    function mSort(source, dest, s, t) {
      var m; //取中间值
      var dest2 = new Array();
      if (s == t) {
        dest[s] = source[s];
       
      }
      else {
        m = Math.floor((s + t) / 2);
        mSort(source, dest2, s, m);
        mSort(source, dest2, m+1 , t);
        merge(dest2, dest, s, m, t);
        /* 输出结果 */
        document.write("<br />第 + ++count + "遍排序的结果是:")
        for (var n = 0; n < dest.length; n++) {
          document.write(array[n] + ",");
        }
        /* 输出结果结束 */
      }

    }
    
    //将两个数组按照从小到大的顺序融合
    //source原数组
    //dest排序后的数组
    //s第一个下标
    //m第二个数组下标
    //总长度
    function merge(source, dest, s, m, n) {
      for (var j = m+1, k = s; j <= n && s <= m; k++) {
        if (source[s] < source[j]) {
          dest[k] = source[s++];
        }
        else {
          dest[k] = source[j++];
        }
      }
      
        //将剩余排不完的有序数组加入到dest的末端
        if (s <= m) {
          for (var l = 0; l <= m - s; l++) {
            dest[k + l] = source[s+l];
          }
        }
        if (j <= n) {
          for (var l = 0; l <= n - j; l++) {
            dest[k + l] = source[j+l];
          }
        
      }
    }

快速排序

快速排序是目前已知的速度最快的排序,时间复杂度为nlogn,代码如下:

var count = 0;
    function quickSort(array, low, high) {
      var temp;
      
      if (low < high) {

        var keypoint = QuickSortHelp(array, low, high);
        count++;
        document.write("<br />第台? + count + "遍括?排?序ò的?结á果?是?:")
        for (var l = 0; l < array.length; l++) {
          document.write(array[l] + ",");
        }
        quickSort(array, low, keypoint - 1);
        quickSort(array, keypoint + 1, high);
        

        }
    }
    function QuickSortHelp(array, low, high) {
      while (low < high) {

        while (low < high && array[low] <= array[high]) {
          high--;
        }
        temp = array[low];
        array[low] = array[high];
        array[high] = temp;
        while (low < high && array[low] <= array[high]) {
          low++
        }
        temp = array[low];
        array[low] = array[high];
        array[high] = temp;

      }
      return low;
    }

以上这篇数据结构中的各种排序方法小结(JS实现)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用正则获取指定路径文件的名称
Feb 27 Javascript
使用JS CSS去除IE链接虚线框的三种方法
Nov 14 Javascript
String.prototype实现的一些javascript函数介绍
Nov 22 Javascript
利用进制转换压缩数字函数分享
Jan 02 Javascript
JsRender for object语法简介
Oct 31 Javascript
jQuery中:hidden选择器用法实例
Dec 30 Javascript
jquery pagination分页插件使用详解(后台struts2)
Jan 22 Javascript
JavaScript数据结构之链表的实现
Mar 19 Javascript
vue-cli构建项目下使用微信分享功能
May 28 Javascript
vue使用keep-alive保持滚动条位置的实现方法
Apr 09 Javascript
详细分析JavaScript中的深浅拷贝
Sep 17 Javascript
解析原生JS getComputedStyle
May 25 Javascript
js的各种排序算法实现(总结)
Jul 23 #Javascript
js事件驱动机制 浏览器兼容处理方法
Jul 23 #Javascript
javaScript事件机制兼容【详细整理】
Jul 23 #Javascript
基于bootstrap实现广告轮播带图片和文字效果
Jul 22 #Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
Jul 22 #Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
Jul 22 #Javascript
JavaScript中的Reflect对象详解(ES6新特性)
Jul 22 #Javascript
You might like
模仿OSO的论坛(五)
2006/10/09 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
php通过array_shift()函数移除数组第一个元素的方法
2015/03/18 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
python list使用示例 list中找连续的数字
2014/01/27 Python
python实现从web抓取文档的方法
2014/09/26 Python
基python实现多线程网页爬虫
2015/09/06 Python
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
python线程里哪种模块比较适合
2020/08/02 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
实习期自我鉴定
2013/10/11 职场文书
策划创业计划书
2014/02/06 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
大学生撤销处分思想汇报
2014/09/12 职场文书
写给同学的新学期寄语
2015/02/27 职场文书
汉字听写大会观后感
2015/06/12 职场文书
雨雪天气温馨提示
2015/07/15 职场文书
Nginx动静分离配置实现与说明
2022/04/07 Servers
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android
Mysql数据库group by原理详解
2022/07/07 MySQL