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

新技术一直在不断变化,掌握一些基础是未来学习不断更新的技术的坚实基础。近来闲来无事,为了温习一下从前学的数据结构,将数据结构中的排序算法用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实现)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • JavaScript sort数组排序方法和自我实现排序方法小结

     前言 针对一个数组进行排序,一个很常见的需求.尤其在后端.当然,前端也是有这个需求的. 当然,数组排序,是有现成的方法的.就是sort()方法. 我们先开看下这个. 标准答案,sort方法 var arr = [45,98,67,57,85,6,58,83,48,18]; console.log('原数组'); console.log(arr); console.log('sort方法从小到大排序'); console.log(arr.sort(function(a,b){return a-b

  • JavaScript实现快速排序的方法

    本文实例讲述了JavaScript实现快速排序的方法.分享给大家供大家参考.具体实现方法如下: <html> <head> <script> function quickSort(input) { if (input.length <= 1) return input; var pivot = Math.floor(Math.random()*input.length) var less = [], greater=[]; var pivotElem = inpu

  • js实现汉字排序的方法

    本文实例讲述了js实现汉字排序的方法.分享给大家供大家参考.具体如下: <script type="text/javascript"> <!-- function startSort(){ var a=document.getElementById('s').value; a=a.split(',') a.sort(); document.getElementById('r1').value=a; a.sort(function(a,b){return a.local

  • JavaScript对象数组的排序处理方法

    本文实例讲述了JavaScript对象数组的排序处理方法.分享给大家供大家参考,具体如下: javascript的数组排序函数 sort方法,默认是按照ASCII 字符顺序进行升序排列. arrayobj.sort(sortfunction); 参数:sortFunction 可选项.是用来确定元素顺序的函数的名称.如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列. sort 方法将 Array 对象进行适当的排序:在执行过程中并不会创建新的 Array 对象. 如果为 so

  • 基于JS实现数字+字母+中文的混合排序方法

    在上篇文章给大家介绍了JavaScript sort数组排序方法和自我实现排序方法小结,用自己的方法实现了数字数组的排序. 当然,实际运用中,我还是会使用sort方法更加方便.但是,我上一篇博文,仅仅是实现了数字排序,而srot方法默认可是能给字母实现排序的哦!而我的代码只能排序数字,看起来还是弱弱的. 所以,我得加上能排字母甚至中文的排序方法. 实现代码 $(function(){ var arr = ["Jack","Book","Fung"

  • JavaScript实现下拉列表框数据增加、删除、上下排序的方法

    本文实例讲述了JavaScript实现下拉列表框数据增加.删除.上下排序的方法.分享给大家供大家参考.具体如下: 这里实现在一个支持多选的下拉列表框内进行数据项的添加.删除.向上.向下移动操作,我们在一些人才网站或是编程技术站经常会看到这种功能,比较实用. 运行效果截图如下: 具体代码如下: <title>下拉列表数据上下排序</title> <SCRIPT LANGUAGE="JavaScript"> <!-- Begin function

  • JS实现为排序好的字符串找出重复行的方法

    本文实例讲述了JS实现为排序好的字符串找出重复行的方法.分享给大家供大家参考,具体如下: 实现这样一个需求,在一个Editplus文档中,有很多行10位的数字,这些数字已经排好序了. 比如: 1234567890 1234567891 1234567892 1234534124 1234614124 4321412414 5636373573 有什么办法能方便的找出两行至少前7位相同的数字吗? 比如,上面的数字中,能够找出 1234567890 1234567891 1234567892 <!D

  • 几种经典排序算法的JS实现方法

    一.冒泡排序 function BubbleSort(array) { var length = array.length; for (var i = length - 1; i > 0; i--) { //用于缩小范围 for (var j = 0; j < i; j++) { //在范围内进行冒泡,在此范围内最大的一个将冒到最后面 if (array[j] > array[j+1]) { var temp = array[j]; array[j] = array[j+1]; arra

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

    新技术一直在不断变化,掌握一些基础是未来学习不断更新的技术的坚实基础.近来闲来无事,为了温习一下从前学的数据结构,将数据结构中的排序算法用JS实现了一遍,并在本文末尾处嵌入了DEMO. 简单排序 冒泡排序 冒泡排序是最简单排序算法,时间复杂度为n的平方,代码如下: function bubbleSort(array) { for (var i = 0; i < array.length; i++) { for (var j = array.length; j > 0; j--) { if (a

  • Java深入了解数据结构中常见的排序算法

    目录 一,概念 1,排序 2,稳定性 二,排序详解 1,插入排序 ①直接插入排序 2,选择排序 ①直接选择排序 ②堆排序 3,交换排序 ①冒泡排序 ②快速排序 4,归并排序 一,概念 1,排序 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 平时的上下文中,如果提到排序,通常指的是排升序(非降序). 通常意义上的排序,都是指的原地排序(in place sort). 2,稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算

  • ThinkPHP5查询数据及处理结果的方法小结

    本文实例讲述了ThinkPHP5查询数据及处理结果的方法.分享给大家供大家参考,具体如下: 在处理数据库查询结果时遇到了些问题,记录下用到过的几种查询方式和结果处理. 1. 查询某条记录 $where=array( "version_id"=>$version_id ); $data = model("PackageWhitelist")->where($where)->find(); $this->assign("package_

  • 刷新页面的几种方法小结(JS,ASP.NET)

    Javascript刷新页面的几种方法: 1. history.go(0) 2. location.reload() 3. location=location 4. location.assign(location) 5. document.execCommand('Refresh') 6. window.navigate(location) 7. location.replace(location) 8. document.URL=location.href 自动刷新页面的方法: 1.页面自动

  • json格式数据的添加,删除及排序方法

    本文实例讲述了json格式数据的添加,删除及排序方法.分享给大家供大家参考,具体如下: js数据格式和json数据格式,各有各的用处,就个人而言,json更好用一点,js自身的数组和对像限制比较多. 以js的数组举例: var a = ['1']; a[5] = 52; a.length //这儿的结果是6,也就是说,中间的key会自动补全,而值呢,是undefined 一.添加和删除 1.一维数组 test = {}; //空json对像 test['firstname'] = "tank&q

  • Node.JS更改Windows注册表Regedit的方法小结

    注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动.硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用.这些作用包括了软.硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件.首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述.状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等. 这里介绍一些通过node.js操作注册表的几种方

  • JS中图片压缩的方法小结

    首先想一想我们有哪些需求?大多时候我们需要将一个File对象压缩之后再变为File对象传入到远程图片服务器:有时候我们也需要将一个base64字符串压缩之后再变为base64字符串传入到远程数据库:有时候后它还有可能是一块canvas画布,或者是一个Image对象,或者直接就是一个图片的url地址,我们需要将它们压缩上传到远程:面对这么多的需求,王二索性画了一张图: Alt text 二.解决办法 如上图所示,王二一共写了七个方法,基本覆盖了JS中大部分文件类型的转换与压缩,其中: 1. url

  • JS中通过url动态获取图片大小的方法小结(两种方法)

    很多时候再项目中,我们往往需要先获取图片的大小再加载图片,但是某些特定场景,如用过cocos2d-js的人都知道,在它那里只能按比例缩放大小,是无法设置指定大小的图片的,这就是cocos2d-js 的坑了,我们必须先获取图片大小,计算比例再对图片进行缩放. 查阅资料,我总结了两种通过url获取图片大小的方法: 1.预加载获取图片大小 var imgLoad = function (url, callback) { var img = new Image(); img.src = url; if

随机推荐