今天了解了一个有意思的排序算法,叫做睡眠排序,排序思路是:遍历整个数组,然后让它“睡”相应时间的,等它睡醒了再将它放入结果数组,js 实现代码如下:
let arr = [3,2,5,4,7,6,1]
let res = []
let timers= [];
for(let i=0;i<arr.length;i++){
timers.push(setTimeout(()=>{ res.push(arr[i]) },arr[i]/10000))
}
Promise.all(timers).then(res=>{
console.log(res) // [1,2,3,4,5,6,7]
})
在这个代码里面,首先,我们准备了两个数组,res 和 timers,res就是我们的最后排序后的数组,timers用于放置定时器函数,用于 Promise.All 确保所有的定时器函数都已经执行完毕。我们将数组遍历一遍,然后将数组的每一项的值作为定时器的时间,定时器做的操作就是将该值push进数组,最后等所有的异步操作执行完毕,res自然就排序完成了;
这个算法有一个问题,就是 不能排序负值,虽然可以每个数据加上一个绝对值最大的负数作为偏移量,但是那还得找出那个数,麻烦。