IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Javascript 实现冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序 -> 正文阅读

[数据结构与算法]Javascript 实现冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序

1. 冒泡排序、选择排序、插入排序。

它们的平均时间复杂度都为 O(n2)。
在这里插入图片描述

1.1 冒泡排序

冒泡排序只会操作相邻的两个数据。
每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。
一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。

// 冒泡排序
const bubbleSort = arr => {
    const length = arr.length;
    if (length <= 1) return;
    // i < length - 1 是因为外层只需要 length-1 次就排好了,第 length 次比较是多余的。
    for (let i = 0; i < length - 1; i++) {
        // j < length - i - 1 是因为内层的 length-i-1 到 length-1 的位置已经排好了,不需要再比较一次。
        for (let j = 0; j < length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
            }
        }
    }
    return arr;
};
  • 第一,冒泡排序是原地排序算法

  • 第二,冒泡排序是稳定的排序算法

  • 第三,冒泡排序的时间复杂度是多少 ?

    • 最佳情况:T(n) = O(n),当数据已经是正序时。
    • 最差情况:T(n) = O(n2),当数据是反序时。
    • 平均情况:T(n) = O(n2)。

1.2 插入排序

  • 假定第一项已经排序了。
  • 后内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

在这里插入图片描述

// 插入排序
const insertionSort = arr => {
    const length = arr.length;
    if (length <= 1) return;

    for (let i = 1; i < length; i++) {
        let preIndex = i - 1; //待比较元素的下标(前一个元素下标)

        let current = arr[i]; //获取当前元素

        while (preIndex >= 0 && arr[preIndex] > current) {
            //前置条件之一: 待比较元素比当前元素大
            arr[preIndex + 1] = arr[preIndex]; //将待比较元素后移一位
            preIndex--; //游标前移一位
        }
        if (preIndex + 1 != i) {
            //避免同一个元素赋值给自身
            arr[preIndex + 1] = current; //将当前元素插入预留空位
        }
    }
    return arr;
};

1.3 选择排序

const selectionSort = arr => {
    const len = arr.length;
    let minIndex, temp;
    for (let i = 0; i < len - 1; i++) {

        minIndex = i;

        for (let j = i + 1; j < len; j++) {

            if (arr[j] < arr[minIndex]) {
                // 寻找最小的数
                minIndex = j; // 将最小数的索引保存
            }
        }
        [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
    }
    return arr;
};

2. 归并排序、快速排序、希尔排序、堆排序

它们的平均时间复杂度都为 O(nlogn)

2.1 归并排序

快排和归并用的都是分治思想 归并排序不是原地排序算法

const mergeSort = (arr) => {
    if (arr.length < 2) return arr;

    let mid = Math.floor(arr.length / 2);
    let left = arr.slice(0, mid);
    let right = arr.slice(mid, arr.length);

    return merge(mergeSort(left), mergeSort(right))



}

const merge = (left, right) => {
    const res = [];
    while (left.length && right.length) {
        if (left[0] <= right[0]) {
            res.push(left.shift())
        } else {
            res.push(right.shift())
        }
    }

    while (left.length) res.push(left.shift());
    while (right.length) res.push(right.shift())

    return res;

}

在这里插入图片描述

2.2 快速排序

快速排序的特点就是快,而且效率高!它是处理大数据最快的排序算法之一。

快排是原地排序算法。

// 快速排序
const quickSort = arr => {
    if (arr.length <= 1) {
        return arr;
    }
    //取基准点
    const midIndex = Math.floor(arr.length / 2);
    //取基准点的值,splice(index,1) 函数可以返回数组中被删除的那个数 arr[index+1]
    const midIndexVal = arr.splice(midIndex, 1);
    const left = []; //存放比基准点小的数组
    const right = []; //存放比基准点大的数组
    //遍历数组,进行判断分配
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] < midIndexVal) {
            left.push(arr[i]); //比基准点小的放在左边数组
        } else {
            right.push(arr[i]); //比基准点大的放在右边数组
        }
    }
    //递归执行以上操作,对左右两个数组进行操作,直到数组长度为 <= 1
    return quickSort(left).concat(midIndexVal, quickSort(right));
};

归并和快排的区别

在这里插入图片描述
在这里插入图片描述

堆排序和希尔排序 后补。。

https://cloud.tencent.com/developer/article/1475120

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:50:27  更:2022-03-15 22:53:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:33:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码