返回顶部
首页 > 资讯 > 精选 >JavaScript怎么实现四种常用排序
  • 191
分享到

JavaScript怎么实现四种常用排序

2023-06-29 08:06:57 191人浏览 独家记忆
摘要

小编给大家分享一下javascript怎么实现四种常用排序,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、插入排序插入排序有直接插入排序,折半插入排序,希尔排序,这里只实现常用的直接插入排序直接插入排序将左侧序列看成一个

小编给大家分享一下javascript怎么实现四种常用排序,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

    一、插入排序

    插入排序有直接插入排序,折半插入排序,希尔排序,这里只实现常用的直接插入排序

    直接插入排序

    将左侧序列看成一个有序序列,每次将一个数字插入该有序序列。

    插入时,从有序序列最右侧开始比较,若比较的数较大,后移一位。

    JavaScript怎么实现四种常用排序

    function insertSort(array) {//第一个默认已经排好      for (let i = 1; i < array.length; i++) {        let target = i;        for (let j = i - 1; j >= 0; j--) {          if (array[target] < array[j]) {            [array[target], array[j]] = [array[j], array[target]]            target = j;          } else {            break;          }        }      }      return array;    }

    复杂度

    时间复杂度:O(n2)

    空间复杂度:O(1)

    稳定性

    稳定

    二、交换排序

    (1)冒泡排序

    循环数组,比较当前元素和上一个元素,如果当前元素比上一个元素小,向下冒泡。

    这样一次循环之后最前一个数就是本数组最小的数。

    下一次循环继续上面的操作,不循环已经排序好的数。

    优化:当一次循环没有发生冒泡,说明已经排序完成,停止循环。

        function bubbleSort(array) {        //第一个循环是所需次数      for (let j = 0; j < array.length; j++) {        let complete = true;        for (let i = array.length-1; i>j; i--) {          // 比较相邻数          if (array[i] < array[i -1]) {            [array[i], array[i - 1]] = [array[i - 1], array[i]];            complete = false;          }        }        // 没有冒泡结束循环        if (complete) {          break;        }      }      return array;    }

    复杂度

    时间复杂度:O(n2)

    空间复杂度:O(1)

    稳定性

    稳定

    (2)快速排序

    快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。

    实现步骤:

    • 选择一个基准元素target(一般选择第一个数)

    • 将比target小的元素移动到数组左边,比target大的元素移动到数组右边

    • 分别对target左侧和右侧的元素进行快速排序

    从上面的步骤中我们可以看出,快速排序也利用了分治的思想(将问题分解成一些小问题递归求解)

    下面是对序列6、1、2、7、9、3、4、5、10、8排序的过程:

    JavaScript怎么实现四种常用排序

    JavaScript怎么实现四种常用排序

    //js自带的sort()就是快排function quickSort(array, start, end) {      if (end - start < 1) {        return;      }      const target = array[start];      let l = start;      let r = end;      while (l < r) {        while (l < r && array[r] >= target) {          r--;        }        array[l] = array[r];        while (l < r && array[l] < target) {          l++;        }        array[r] = array[l];      }      array[l] = target;      quickSort(array, start, l - 1);      quickSort(array, l + 1, end);      return array;    }

    复杂度

    时间复杂度:平均O(nlogn),最坏O(n2),实际上大多数情况下小于O(nlogn)

    空间复杂度:O(logn)(递归调用消耗)

    稳定性

    不稳定

    三、选择排序

    (1)简单选择排序

    每次循环选取一个最小的数字放到前面的有序序列中。 

    JavaScript怎么实现四种常用排序

     function selectionSort(array) {      for (let i = 0; i < array.length - 1; i++) {        let minIndex = i;        for (let j = i + 1; j < array.length; j++) {          if (array[j] < array[minIndex]) {            minIndex = j;          }        }        [array[minIndex], array[i]] = [array[i], array[minIndex]];      }    }

    复杂度

    时间复杂度:O(n2)

    空间复杂度:O(1)

    稳定性

    不稳定

    (2)堆排序

    创建一个大顶堆,大顶堆的堆顶一定是最大的元素。

    交换第一个元素和最后一个元素,让剩余的元素继续调整为大顶堆。

    从后往前以此和第一个元素交换并重新构建,排序完成。

     function heapSort(array) {      creatHeap(array);      console.log(array);      // 交换第一个和最后一个元素,然后重新调整大顶堆      for (let i = array.length - 1; i > 0; i--) {        [array[i], array[0]] = [array[0], array[i]];        adjust(array, 0, i);      }      return array;    }    // 构建大顶堆,从第一个非叶子节点开始,进行下沉操作    function creatHeap(array) {      const len = array.length;      const start = parseInt(len / 2) - 1;      for (let i = start; i >= 0; i--) {        adjust(array, i, len);      }    }    // 将第target个元素进行下沉,孩子节点有比他大的就下沉    function adjust(array, target, len) {      for (let i = 2 * target + 1; i < len; i = 2 * i + 1) {        // 找到孩子节点中最大的        if (i + 1 < len && array[i + 1] > array[i]) {          i = i + 1;        }        // 下沉        if (array[i] > array[target]) {          [array[i], array[target]] = [array[target], array[i]]          target = i;        } else {          break;        }      }    }

    复杂度

    时间复杂度:O(nlogn)

    空间复杂度:O(1)

    稳定性

    不稳定

    四、归并排序

    利用归并的思想实现的排序方法。

    算法是采用分治法(Divide and Conquer)的一个非常典型的应用。(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

    • 将已有序的子序列合并,得到完全有序的序列

    • 即先使每个子序列有序,再使子序列段间有序

    • 若将两个有序表合并成一个有序表,称为二路归并

    分割:

    • 将数组从中点进行分割,分为左、右两个数组

    • 递归分割左、右数组,直到数组长度小于2

    归并:

    如果需要合并,那么左右两数组已经有序了。

    创建一个临时存储数组temp,比较两数组第一个元素,将较小的元素加入临时数组

    若左右数组有一个为空,那么此时另一个数组一定大于temp中的所有元素,直接将其所有元素加入temp 

    JavaScript怎么实现四种常用排序

    function mergeSort(array) {      if (array.length < 2) {        return array;      }      const mid = Math.floor(array.length / 2);      const front = array.slice(0, mid);      const end = array.slice(mid);      return merge(mergeSort(front), mergeSort(end));    }     function merge(front, end) {      const temp = [];      while (front.length && end.length) {        if (front[0] < end[0]) {          temp.push(front.shift());        } else {          temp.push(end.shift());        }      }      while (front.length) {        temp.push(front.shift());      }      while (end.length) {        temp.push(end.shift());      }      return temp;    }

    做题时,上面多了删除过程,特别大的例子,时间也可能会超,用下面的方法

    function merge(left, right){    let leftLen = left.length, rightLen = right.length;    let i = 0, j = 0;    let temp = new Array(leftLen + rightLen);    for(let cur = 0; cur < leftLen + rightLen; cur++){        // 检查i, j有没有超界        if(i >= leftLen) temp[cur]= right[j++];        else if(j >= rightLen) temp[cur] = left[i++];        else if(left[i] <= right[j]){            temp[cur] = left[i++];        }else{            temp[cur] = right[j++];        }    }    return temp;}

    复杂度

    时间复杂度:O(nlogn)

    空间复杂度:O(n)

    稳定性

    稳定

    看完了这篇文章,相信你对“JavaScript怎么实现四种常用排序”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

    --结束END--

    本文标题: JavaScript怎么实现四种常用排序

    本文链接: https://lsjlt.com/news/323540.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • JavaScript怎么实现四种常用排序
      小编给大家分享一下JavaScript怎么实现四种常用排序,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、插入排序插入排序有直接插入排序,折半插入排序,希尔排序,这里只实现常用的直接插入排序直接插入排序将左侧序列看成一个...
      99+
      2023-06-29
    • 详解JavaScript如何实现四种常用排序
      目录一、插入排序直接插入排序二、交换排序(1)冒泡排序(2)快速排序三、选择排序(1)简单选择排序(2)堆排序四、归并排序一、插入排序 插入排序有直接插入排序,折半插入排序,希尔排序...
      99+
      2024-04-02
    • Python实现排序方法常见的四种
      1.冒泡排序,相邻位置比较大小,将比较大的(或小的)交换位置 def maopao(a): for i in range(0,len(a)): for j...
      99+
      2024-04-02
    • 快速排序的四种python实现
      快速排序算法,简称快排,是最实用的排序算法,没有之一,各大语言标准库的排序函数也基本都是基于快排实现的。 本文用python语言介绍四种不同的快排实现。 1. 一行代码实现的简洁版本 quick_sort = lambda array:...
      99+
      2023-01-31
      四种 快速 python
    • python怎么实现常用的五种排序算法
      这篇文章将为大家详细讲解有关python怎么实现常用的五种排序算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、冒泡排序原理:比较相邻的元素。如果第一个比第二个大就交换他们两个每一对相邻元素做同样的工...
      99+
      2023-06-20
    • 用JavaScript实现的七种排序算法
      这篇文章主要讲解了“用JavaScript实现的七种排序算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用JavaScript实现的七种排序算法”吧!目录前言冒泡排序基础算法第二种写法是在...
      99+
      2023-06-20
    • PHP常用几种排序
      php常用的几种排序 1 冒泡排序1.1 描述:1.2 动画:1.3 代码案例: 2 快速排序2.1 描述:2.2 动画:![在这里插入图片描述](https://img-blog.csd...
      99+
      2023-09-05
      排序算法 算法
    • 利用JavaScript实现的10种排序算法总结
      目录1、冒泡排序算法2、选择排序算法3、插入排序算法4、 希尔排序算法5、归并排序算法6、 快速排序算法7、堆排序算法8、计数排序算法9、桶排序算法10、基数排序...
      99+
      2023-05-19
      JavaScript排序算法 JavaScript算法 JavaScript排序
    • JavaScript中怎么实现冒泡排序和选择排序
      本篇文章为大家展示了JavaScript中怎么实现冒泡排序和选择排序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。算法说明算法(Algorithm)是解决问题的一种...
      99+
      2024-04-02
    • Javascript数组重排序怎么实现
      本文小编为大家详细介绍“Javascript数组重排序怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Javascript数组重排序怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
      99+
      2024-04-02
    • c语言实现的几种常用排序算法
      概述 最近重新回顾了一下数据结构和算法的一些基本知识,对几种排序算法有了更多的理解,也趁此机会通过博客做一个总结。 1.选择排序-简单选择排序 选择排序是最简单的一种基于O(n2)时...
      99+
      2024-04-02
    • php怎么实现常见的排序
      这篇文章给大家分享的是有关php怎么实现常见的排序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下$arr = [4,5,3,2,1,9,8,6,7];冒泡排序function&nb...
      99+
      2023-06-15
    • Java常用的八种排序算法与代码实现
      目录1.直接插入排序2.希尔排序3.简单选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序8.基数排序1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列...
      99+
      2024-04-02
    • JavaScript排序对象数组怎么实现
      这篇文章主要介绍“JavaScript排序对象数组怎么实现”,在日常操作中,相信很多人在JavaScript排序对象数组怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
      99+
      2024-04-02
    • JavaScript怎么实现拖拽排序效果
      这篇“JavaScript怎么实现拖拽排序效果”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript怎么实现拖拽...
      99+
      2023-06-30
    • JavaScript怎么实现基础排序算法
      本文小编为大家详细介绍“JavaScript怎么实现基础排序算法”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript怎么实现基础排序算法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。正文1、冒泡排...
      99+
      2023-07-02
    • Java实现几种常见排序算法代码
      稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关键字R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。 排序算法分类 常见的有插入(插入排序/...
      99+
      2022-11-15
      Java 排序算法
    • Java常见排序算法怎么实现
      本文小编为大家详细介绍“Java常见排序算法怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java常见排序算法怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。汇总:1. 冒泡排序每轮循环确定最值;...
      99+
      2023-06-29
    • Golang怎么实现常见排序算法
      这篇文章主要介绍“Golang怎么实现常见排序算法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang怎么实现常见排序算法”文章能帮助大家解决问题。五种基础排序算法对比五种基础排序算法对比1、...
      99+
      2023-06-30
    • javascript sort()排序怎么用
      本篇文章给大家分享的是有关javascript sort()排序怎么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言在Javascript...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作