• JavaScript 编写排序算法:冒泡排序、选择排序、插入排序


    JavaScript 编写排序算法:

    • 冒泡排序
    • 选择排序
    • 插入排序
    • 总结

    交换两个元素的位置

    1. const swap = (arr, i, j) => {
    2. arr[i] = arr[i] ^ arr[j];
    3. arr[j] = arr[i] ^ arr[j];
    4. arr[i] = arr[i] ^ arr[j];
    5. }

    冒泡排序

    每外循环一次,实现当前范围内最大值找出放到右边位置。子循环内每次相邻两个比较,大者移动到后面。

    1. // 冒泡
    2. const bubbleSort = (arr) => {
    3. for (let i = arr.length - 1; i > 0; i--) {
    4. for (let j = 0; j < i; j++) {
    5. if (arr[j] > arr[j + 1]) {
    6. swap(arr, j, j + 1)
    7. }
    8. }
    9. }
    10. console.log(arr)
    11. };
    12. // 改进后的冒泡 如果内循环没有发生或一次交换,则数组已经有序了
    13. const modifiedBubbleSort = (arr) => {
    14. let k = 0;
    15. for (let i = arr.length - 1; i > 0; i--) {
    16. k = 0;
    17. for (let j = 0; j < i; j++) {
    18. if (arr[j] > arr[j + 1]) {
    19. swap(arr, j, j + 1)
    20. k = 1;
    21. }
    22. }
    23. if (k === 0) {
    24. return arr;
    25. }
    26. }
    27. console.log(arr)
    28. };

    选择排序

    每外循环一次,找到当前范围最小值放到当前范围第一个位置,依次选择最小值放在第一位,第二位……

    1. const selectionSort =(arr) => {
    2. let minIndex = 0;
    3. for (let i = 0; i< arr.length -1; i++) {
    4. minIndex = i;
    5. for (let j = i + 1; j< arr.length; j++) {
    6. if (arr[minIndex] > arr[j]) {
    7. minIndex = j;
    8. }
    9. }
    10. if (i !== minIndex) {
    11. swap(arr, i, minIndex)
    12. }
    13. }
    14. console.log(arr)
    15. }

    插入排序

    假定以一个已经排好序了,第二应该插入到第一个的前面还是后面呢,第一二已经排好序了,第三个应该插入到哪个位置呢?

    temp 表示即将插入的值,前者大则一个一个往后移。采用赋值方式,不用交换值。

    1. const insertionSort =(arr) => {
    2. let temp = null;
    3. for (let i = 1; i< arr.length; i++) {
    4. let j = i, temp = arr[i];
    5. for (let j = i; j > 0 && arr[j-1] > temp; j--) {
    6. arr[j] = arr[j-1];
    7. }
    8. arr[j] = temp;
    9. }
    10. console.log(arr)
    11. }

    或者:前者大则两者交换。 不使用 temp 空间,多少会增加点运算时间。

    1. const insertionSort2 =(arr) => {
    2. let temp = null;
    3. for (let i = 1; i < length; i++) {
    4. for (let j = i; j > 0 && arr[j-1] > arr[j]; j--) {
    5. swap(arr, j-1, j);
    6. }
    7. }
    8. console.log(arr)
    9. }

    测试

    要排序的数组为:倒序的 9999 ~ 0,共有10000个数字。

    1. let beforeArray = [];
    2. for (let i = 0; i < 10000; i++) {
    3. beforeArray.unshift( i );
    4. }

    在 chrome 浏览器,某次的测试结果:(粗略测试,仅做参考)

    10000个数字倒序下排序

    在20000个数字倒序下,排序花费时间是:

    20000个数字倒序下排序

    总结

    • 冒泡排序:时间 O(N^2),空间 O(1),稳定。
    • 选择排序:时间 O(N^2),空间 O(1),不稳定。
    • 插入排序:时间 O(N^2),空间 O(1),稳定。

    选择排序进行互换可能跨越多个元素,所以不稳定。
    比如[5,3,5,4,2,1], 第一轮最小元素1和第一个5交换了,第一个5就在第二个5之后了。

    在JavaScript中,这三者排序的效率都是差不多的。选择排序稍快一点。

  • 相关阅读:
    飞行动力学 - 第32节-荷兰滚飞行品质 之 基础点摘要
    和平精英官方网站静态页面制作与学习html+css保姆级教程
    String 为什么不可变?不可变有什么好处?
    华为认证系统学习大纲及课程
    LeetCode 209 长度最小的子数组
    【Pytorch】深度学习之数据读取
    C# 设计保存文件
    Unity3D 游戏编程中需要掌握的数学知识详解
    Shell脚本中文英文多语言国际化和命令行批处理(bash sh cmd bat)中定义函数的简单写法
    23.CountDownLatch的应用和原理
  • 原文地址:https://blog.csdn.net/weixin_70437515/article/details/125477081