数据结构中的各种排序方法小结(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 相关文章推荐
JQUERY CHECKBOX全选,取消全选,反选方法三
Aug 30 Javascript
谈谈jQuery Ajax用法详解
Nov 27 Javascript
js实现将选中内容分享到新浪或腾讯微博
Dec 16 Javascript
深入浅析JavaScript中的constructor
Apr 19 Javascript
jQuery自制提示框tooltip改进版
Aug 01 Javascript
在使用JSON格式处理数据时应该注意的问题小结
May 20 Javascript
简单谈谈关于Angular Cli打包的事
Sep 05 Javascript
web前端页面生成exe可执行文件的方法
Feb 08 Javascript
JS实现获取进今年第几天是周几的方法分析
Jun 27 Javascript
Array数组对象中的forEach、map、filter及reduce详析
Aug 02 Javascript
vue路由对不同界面进行传参及跳转的总结
Apr 20 Javascript
JS使用正则表达式实现常用的表单验证功能分析
Apr 30 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
php 注释规范
2012/03/29 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
angularjs封装bootstrap时间插件datetimepicker
2016/06/20 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
Python 使用Opencv实现目标检测与识别的示例代码
2020/09/08 Python
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
应届生幼儿园求职信
2013/11/12 职场文书
聚美优品励志广告词
2014/03/14 职场文书
融资租赁计划书
2014/04/29 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
小数乘法教学反思
2016/02/22 职场文书