前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >js 实现插入排序

js 实现插入排序

作者头像
蓓蕾心晴
发布2022-09-24 14:53:51
5860
发布2022-09-24 14:53:51
举报
文章被收录于专栏:前端小叙前端小叙
代码语言:javascript
复制
// 插入排序的原理:
// 一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。
// 插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。
// 稳定性:插入排序是判断当元素小于才进行交换,所以为稳定排序
// 冒泡排序是两个两个交换
// 选择排序是每一个和无序数列中的起始位置进行交换
// 插入排序是每一个无序数列中的元素分别和有序数列中的每一个进行对比和交换,直到遇到比他小的,则停止交换,插入该元素
// 每次都进行两两交换版本
function insertSort(arr) {
    if (arr.length < 2) {
        return arr;
    }
    // 定义 count 代表执行了趟循环
    let count = 0;
    // i 代表每趟循环,获取的无序数列的其实位置,从第一位开始
    for (let i = 1; i < arr.length; i++) {
        count++;
        // 提前存下无序数列中的其实值,作为待插入值,此时 i=j+1
        let inertValue = arr[i];
        // 从右向左遍历有序数列,有序数列的起点是第 0 位,终点是无序数列前一位,即 i-1
        for (let j = i - 1; j >= 0; j--) {
            const temp = arr[j];
            // 如果要插入的元素小于当前位置元素  交换两个元素位置
            if (inertValue < arr[j]) {
                arr[j] = inertValue;
                // inertValue每次插入后会改变该值的索引,所以
                arr[j + 1] = temp;
            }
        }
    }
    console.log(`执行了${count}趟循环`);
    return arr;
}
console.log("直接插入排序");
console.log(insertSort([6, 3, 2, 1, 6, 3, 7, 8, 2, 4, 0, 1, 6, 5])); // 执行了13趟循环
console.log(insertSort([6, 3, 7, 8, 2, 4, 0, 1, 6, 5])); // 执行了9趟循环
console.log(insertSort([1, 2, 3, 4, 5, 6, 7, 8, 9, 9])); // 执行了9趟循环
// 优化版:先将需要移动的元素位置一一变更,最终找到需要插入的位置,直接插入
function insertSort2(arr) {
    if (arr.length < 2) {
        return arr;
    }
    // 定义 count 代表执行了趟循环
    let count = 0;
    for (let i = 1; i < arr.length; i++) {
        count++;
        // 暂存当前待插入元素
        let insertValue = arr[i];
        let j = i - 1;
        // 循环执行的条件是当前插入的元素小于当前遍历到的元素
        for (; j >= 0 && insertValue < arr[j]; j--) {
            // 之所以可以始终后移,不怕覆盖最后一位元素,是因为最后一位即为待插入元素的位置
            arr[j + 1] = arr[j]; // 如果 当前插入的元素小于当前遍历到的元素,则将该位置元素后移
        }
        // 最终循环终止时,j 即为当前待插入元素的位置
        // insertValue的值插入适当位置
        arr[j + 1] = insertValue;
    }
    console.log(`执行了${count}趟循环`);
    return arr;
}
console.log("直接插入排序2");
console.log(insertSort2([6, 3, 2, 1, 6, 3, 7, 8, 2, 4, 0, 1, 6, 5])); // 执行了13趟循环
console.log(insertSort2([6, 3, 7, 8, 2, 4, 0, 1, 6, 5])); // 执行了9趟循环
console.log(insertSort2([1, 2, 3, 4, 5, 6, 7, 8, 9, 9])); // 执行了9趟循环

参考链接:https://blog.csdn.net/hcz666/article/details/126488359

https://www.jb51.net/article/145115.htm

原文链接:https://cloud.tencent.com/developer/article/2121026

转载请注明出处

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档