打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JS--排序算法之简单排序

冒泡排序

  • 时间复杂度: O(n^2)

  • 稳定的排序算法

  • 特点: 从后向前找,有序区数字一定全部小于(或大于)无序区数字

  • 性能: 慢

  • 优化: 双向冒泡(鸡尾酒排序)

    function bubbleSort(ary) {
        let exchange = 0, 
            temp = null,
             n = ary.length;
        // i<n-1 而不是 i<n, 当遍历到n-1次时已近排好序了 >, 
        for(let i=0; i<n-1; i++) {
            // 从后面向前遍历, 用前一项比后一项
            for(let j = n-2; j>=i; j--) {
                if(ary[j+1] < ary[j]) {
                    temp = ary[j];
                    ary[j] = ary[j+1];
                    ary[j+1] = temp;
                    exchange = 1;
                }
            }
            // 如果没有发生交换(表明排序完成),直接退出排序
            if(exchange) break;
        }
        return ary;
    }

效果示例:

直接插入排序

  • 时间复杂度: O(n^2)

  • 稳定的排序算法

  • 特点: 将单前元素插入前面有序区中排序, 有序区中元素不一定小于(大于)无序区元素

  • 性能: 在数组元素基本有序的情况下速度很快

  • 优化: 设置增量, 让数组基本有序,然后在不断缩减增强(希尔排序)

    function straightInsertionSort(ary) {
        let n = ary.length,
            temp = null;
        for (let i = 1; i < n; i++) {
            // 如果后一项小于前一项,说明需要交换
            if (ary[i] < ary[i - 1]) {
                // temp = 需要交换的项
                temp = ary[i];
                let j = i - 1;
                do {
                    // 前面的向后面移动
                    ary[j + 1] = ary[j];
                    j--;
                } while (j >= 0 && temp < ary[j]); // 找到temp需要插入的位置
                // 插入temp
                ary[j + 1] = temp;
            }
        }
    return ary;
    }

效果显示:

直接选择排序

  • 时间复杂度: O(n^2)

  • 不稳定的排序算法

  • 特点: 从前向后找到最小(最大)的, 然后和第一个交换, 有序区一定小于(大于)无序区

  • 性能: 比冒泡强

  • 不稳定原因: 元素的交换可能直接跨过多个元素,相等元素可能发生位置变化

    • 例如: 553 => 排序时 第一个5和3直接交换, 第一个5就到第二个5后面去了, 位置发生变化

    function straightSelectSort(ary) {
        let n = ary.length,
            temp = null;
        for(let i=0; i<n-1; i++) {
            let k = i;
            for(let j = i+1; j<n; j++) {
                // 找到最小值的位置
                if(ary[j]<ary[k]) k=j;
            }
            if(k!== i) {
                temp = ary[i];
                ary[i] = ary[k];
                ary[k] = temp;
            }
        }
        return ary;
    }

效果示例:

gif来源: 排序算法-散点可视化

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
排序算法
常见的排序算法总结
8大排序算法之:快速交换排序(Quick Exchange Sort)
数据结构(C++版)PPT 第10章
[Swift] 排序算法(一):冒泡排序
JavaScript:十大排序的算法思路和代码实现
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服