猴子排序是什么(最“速”)
我称之为吗喽排序
让一群猴子在打印机前昼夜不停地敲打键盘,最终有可能能输入一部莎士比亚作品集——尽管概论微乎其微。同理,把一堆扑克牌扔到天上,等它们落下来的时候有概率会刚刚好从小到大排成一列。
猴子排序就是把一个数组全部打乱,总有一次能够排序成功。这个时间复杂度依据数组长度,数越多,理论上也可以到达正无穷,但是最小时间复杂度可以到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>}
好的,以上算法介绍完毕,相信大家能够掌握它们并且能够熟悉运用之后就能走上------失业的道路