数据结构中的各种排序方法小结(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 相关文章推荐
Javascript实现的分页函数
Feb 07 Javascript
JQuery 操作/获取table具体代码
Jun 13 Javascript
jquery复选框checkbox实现删除前判断
Apr 20 Javascript
Javascript中的关键字和保留字整理
Oct 16 Javascript
javascript结合canvas实现图片旋转效果
May 03 Javascript
JavaScript中setMonth()方法的使用详解
Jun 11 Javascript
jquery实现两边飘浮可关闭的对联广告
Nov 27 Javascript
jsTree使用记录实例
Dec 01 Javascript
原生JS封装animate运动框架的实例
Oct 12 Javascript
angularJS实现动态添加,删除div方法
Feb 27 Javascript
JavaScript观察者模式原理与用法实例详解
Mar 10 Javascript
vue使用video插件vue-video-player详解
Oct 23 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 中的一些经验积累
2006/10/09 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
js中生成map对象的方法
2014/01/09 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
js 操作符汇总
2014/11/08 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
JS数组方法slice()用法实例分析
2020/01/18 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
js实现缓动动画
2020/11/25 Javascript
python列表操作使用示例分享
2014/02/21 Python
独特的python循环语句
2016/11/20 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
Django celery异步任务实现代码示例
2020/11/26 Python
python openssl模块安装及用法
2020/12/06 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
水电站项目建议书
2014/05/12 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
2014年市场部工作总结
2014/11/25 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书
《颐和园》教学反思
2016/02/19 职场文书
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL