js——排序算法(冒泡、插入、快速、归并)

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

稳定排序有:插入排序、冒泡排序、归并排序
不稳定排序:希尔排序、快速排序、选择排序、堆排序

let arr = [8657, 2, 3, 4, 2, 3, 23, 4, 234, 5, 456, 456, 23]

冒泡排序(O(n^2)

function sort(arr) {
    for (let i = 0, len = arr.length; i < len; i++) {
        for (let j = i + 1; j < len; j++) {
            if (arr[i] > arr[j]) {
                let temp = arr[j]
                arr[j] = arr[i]
                arr[i] = temp
            }
        }
    }
    return arr
}

arr = sort(arr)

插入排序(O(n^2)

function sort(arr) {
    for (let i = 1, len = arr.length; i < len; i++) {
        for (let j = i; j >= 0 && arr[j] < arr[j - 1]; j--) {
            let temp = arr[j]
            arr[j] = arr[j - 1]
            arr[j - 1] = temp
        }
    }
    return arr
}

arr = sort(arr)

希尔排序(插入排序的改进版)

// 将表分为几段长度,分别进行排序,然后进行总的排序
function sort(arr) {
    let [len, i, j, temp] = [arr.length]

    do {
        len = Math.floor(len / 3 + 1);
        for (i = len; i < arr.length; i++) {
            if (arr[i] < arr[i - len]) {
                temp = arr[i]; // 先将小的数值存储
                
                // 遍历前面的数值,将比找到的这个小的值大的值往后移
                for (j = i - len; j >= 0 && temp < arr[j]; j -= len) {
                    arr[j + len] = arr[j]; // 不断移动,找到这个 temp 应该插入的位置
                }
                arr[j + len] = temp; // 插入该位置
            }
        }
    }
    while (len > 1)

    return arr
}

快速排序(O(n log n)

  1. 选基准:中间值
  2. 划分区:跟基准比较
  3. 递归
function sort(arr) {
    if (arr.length <= 1) return arr

    let pivotIndex = Math.floor(arr.length / 2)
    let pivot = arr.splice(pivotIndex, 1)[0]
    let left = [], right = []

    for (let i = 0, len = arr.length; i < len; i++) {
        if (arr[i] < pivot) {
            left.push(arr[i])
        } else {
            right.push(arr[i])
        }
    }

    return sort(left).concat([pivot], sort(right))
}

arr = sort(arr)

归并排序(O(n log n)

先分后治

function sort(arr) {
    if (arr.length <= 1) return arr
    let mid = Math.floor(arr.length / 2)
    let left = arr.slice(0, mid), right = arr.slice(mid) // 分

    let marge = (left, right) => { // 用来融合两个有序数组(治)
        let minArr = []
        
        // 将值较小的 push 进入 minArr,并 shift 掉比较后的第一个元素
        while (left.length && right.length)
            left[0] < right[0] ? minArr.push(left.shift()) : minArr.push(right.shift());

        return [...minArr, ...left, ...right]
    }

    return marge(arguments.callee(left), arguments.callee(right))
}

arr = sort(arr)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生就业服务平台管理系统按照操作主体分为管理员和用户。管理员的功能包括学生档案管理、字典管理、试卷管理、试卷选题管理、试题表管理、考试记录表管理、答题详情表管理、错题表管理、法律法规管理、法律法规收藏管理、法律法规留言管理、就业分析管理、论坛管理、企业管理、简历管理、老师管理、简历投递管理、新闻资讯管理、新闻资讯收藏管理、新闻资讯留言管理、学生信息管理、宣传管理、学生管理、职位招聘管理、职位收藏管理、招聘咨询管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生就业服务平台管理系统可以提高大学生就业服务平台信息管理问题的解决效率,优化大学生就业服务平台信息处理流程,保证大学生就业服务平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理新闻信息,管理大学生就业服务平台信息,包括考试管理,培训管理,投递管理,薪资管理等,可以管理新闻信息。 考试管理界面,管理员在考试管理界面中可以对界面中显示,可以对考试信息的考试状态进行查看,可以添加新的考试信息等。投递管理界面,管理员在投递管理界面中查看投递种类信息,投递描述信息,新增投递信息等。新闻信息管理界面,管理员在新闻信息管理界面中新增新闻信息,可以删除新闻信息。新闻信息类型管理界面,管理员在新闻信息类型管理界面查看新闻信息的工作状态,可以对新闻信息的数据进行导出,可以添加新新闻信息的信息,可以编辑新闻信息信息,删除新闻信息信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值