• 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中,这三者排序的效率都是差不多的。选择排序稍快一点。

  • 相关阅读:
    【车道线检测】车道线检测算法汇总
    MySQL 高级(进阶) SQL 语句 (一)
    蓝桥杯-修建灌木
    阿里云Redis开发遇到的问题总结
    【云原生】springcloud07—Consul的服务注册与发现
    ESP32网络开发实例-HTTP-POST请求
    sysbench
    小红书达人投放比例是多少合适?品牌方必看
    linux rsyslog安装配置
    考研概率论与数理统计(知识点梳理)
  • 原文地址:https://blog.csdn.net/weixin_70437515/article/details/125477081