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 算法】-- 数组排序实现与思考 -> 正文阅读

[JavaScript知识库]【JavaScript 算法】-- 数组排序实现与思考

备注:这里默认是从小到大排序

一、冒泡排序

冒泡排序的过程:从第一个元素开始,重复比较相邻的两个项,若第一项比第二项更大,则交换两者的位置;每一轮操作,都会将这一轮中最大的元素放置到数组的末尾

编码实现:

/**
 * @description 冒泡排序
 * @param {*} arr
 * @return {*} 
 */
function bubbleSort(arr) {
    let len = arr.length
    for (let i = 0; i < len; i++) {
        for (let j = 0; j < len - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
            }
        }
    }
    return arr
}

思考①:

????????我们每一轮我们都将最大数放到了末尾,那我们还有必要在进行 len - 1?轮的判断吗?

????????答案当然是不用。为了避免这些冗余的比较动作,我们需要规避掉数组中的后 i 个元素。

编码实现:

/**
 * @description 冒泡排序优化
 * @param {*} arr
 * @return {*} 
 */
function betterbubbleSort(arr) {
    let len = arr.length
    for (let i = 0; i < len; i++) {
        for (let j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
            }
        }
    }
    return arr
}

思考②:

? ? ? ? 假设这个数组大部分都是有序的只有一小部分是无序的,那按我们上面的写法是不是有些判断就没有必要进行?

? ? ? ? 对的,最优的冒泡排序算法复杂度在最好情况下是 O(n)。

编码实现:

/**
 * @description 冒泡排序优化
 * @param {*} arr
 * @return {*} 
 */
function bestbubbleSort(arr) {
    let len = arr.length
    for (let i = 0; i < len; i++) {
        let flag = false
        for (let j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                flag = true
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
            }
        }
        // 若一次交换也没发生,则说明数组有序,直接放过
        if (!falg) return arr
    }
    return arr
}

时间复杂度:?平均复杂度?O(n^2)最好复杂度 O(n)


二、选择排序

选择排序过程:循环遍历数组,每次都找出当前范围内的最小值,把它放在当前范围的头部;然后缩小排序范围,继续重复以上操作,直至数组完全有序为止。

编码实现:

/**
 * @description 选择排序
 * @param {*} arr
 * @return {*} 
 */
function selectSort(arr) {
    let len = arr.length
    for (let i = 0; i < len - 1; i++) {
        let index = i
        for (let j = i + 1; j < len; j++) {
            if (arr[j] < arr[index]) {
                index = j
            }
        }
        [arr[i], arr[index]] = [arr[index], arr[i]]
    }
    return arr
}

????????选择排序相对来说比较简单,它的思路导致了我们必须要走内层循环。

时间复杂度:?平均复杂度?O(n^2)


三、插入排序

插入排序过程:就是将当前元素前面的元素排序,然后进行插入。插入的意思就是将它放到前面合适的位置。(使用双指针来进行插入判断)

核心思想:找到元素在它前面那个序列中的正确位置

/**
 * @description 插入排序
 * @param {*} arr
 * @return {*}
 */
function insertSort(arr) {
    let len = arr.length
    for (let i = 1; i < len; i++) {
        let j = i;
        let temp = arr[i]
        while (j > 0 && arr[j - 1] > temp) {
            arr[j] = arr[j - 1]
            j--
        }
        arr[j] = temp
    }
    return arr
}

时间复杂度:?平均复杂度?O(n^2),最好复杂度?O(n)

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-05 17:16:33  更:2021-08-05 17:16:59 
 
开发: 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年5日历 -2024/5/17 10:48:19-

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