无敌吊炸天!最“速”!最脑洞大开!排序算法之猴子排序和睡眠排序

猴子排序是什么(最“速”)

我称之为吗喽排序


让一群猴子在打印机前昼夜不停地敲打键盘,最终有可能能输入一部莎士比亚作品集——尽管概论微乎其微。同理,把一堆扑克牌扔到天上,等它们落下来的时候有概率会刚刚好从小到大排成一列。

猴子排序就是把一个数组全部打乱,总有一次能够排序成功。这个时间复杂度依据数组长度,数越多,理论上也可以到达正无穷,但是最小时间复杂度可以到1(欧皇附体)
简单的来说,就是把要排列的数组随机打乱,总能有一种情况是排列好的情况

function shuffle(numbers){
    let len = numbers.length
    while (len--){
        let random = (Math.random() * len >>> 0);  //  注意分号 否则JS会认为是()[]
            [numbers[random], numbers[len]] = [numbers[len], numbers[random]]
    }
}
function monkeySort(numbers){
    while (true){
        shuffle(numbers)
        let blo = true
        for (let i=0; i<numbers.length-1; i++){
            if (numbers[i]>numbers[i+1]){
                blo = false
                break
            }
        }
        if (blo) return
    }
}
monkeySort(arr)
console.log(arr);  //  [-9, -7, 2, 4, 6]


缺点和优点
优点:世界上最速排序,有一定的几率可以第一次就排序好
缺点:随机性太大,耗时太长

  • 睡眠排序是什么?(最脑洞大开)

    • 睡眠排序利用的就是CPU的调度,使用Thread的sleep函数,给每一个值都加上一个线程,让该线程睡这个值的时间,那不就是你越大睡的越久,值越小越早醒,然后先醒的先放到数组里,后醒的后放到数组里,,所以能起到排序的作用。时间复杂度取决于这个数组里的最大数是多少,理论上可以达到正无穷。
  • 为什么有睡眠排序?
    • (你就说他能不能排序就完事了,不就花多亿点线程嘛)

JS是单线程的,可以使用setTimeout来假装一下,下面的手写使用 async 和 await 处理异步函数:

let arr = [2,4,-7,6,-9]
function getArray(numbers){
    return new Promise((resolve) => {
        let ary = []
        numbers.forEach((el) => {
            //  如果小于0 那就按照先完成的先放,后完成的后放(时间越大数越小,放在数组左边)
            if (el < 0) {
                setTimeout(() => {
                    ary.unshift(el)
                    if (ary.length === numbers.length) resolve(ary)
                }, ~(el * 4 + 4))  // 时间取正数 因为 setTimeout 的最小延迟时间是4ms以及确保0的时候也有延迟
            } else {
                setTimeout(() => {
                    ary.push(el)
                    if (ary.length === numbers.length) resolve(ary)
                }, el * 4 + 4)
            }
        })
    });
}
async function sleepSort(numbers){  //  异步函数
    let data = await getArray(numbers)  //  等待promise 完成并返回结果
    console.log(data)  //  [-9, -7, 2, 4, 6]
    return data
}
console.log(sleepSort(arr));  //  Promise{<pending>}

好的,以上算法介绍完毕,相信大家能够掌握它们并且能够熟悉运用之后就能走上------失业的道路

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值