Open LoeiFy opened 7 years ago
原理就是将要排序的数组的每一个项作为 setTimeout 时间参数,然后就可以排序了
setTimeout
排序时间跟数组最大值绝对值有关 :)
需要对数组的负数项做一下处理,因为 setTimeout 参数负数的话跟参数 0 是一样的
例子 JSFiddle
具体代码说明:
// 需要排序数组 const numbers = [8, 0, 3, -1, 9, -3, -767, 4, 111, 999, 89]; async function sortArr(arr) { const left = arr.filter(a => a < 0).map(a => a * -1) // 获取数组负数项并转成正数 const right = arr.filter(a => a >= 0) // 数组正数项 const sortLeft = (await sort(left)).map(a => a * -1).reverse() // 负数项排序后需要反向 const sortRight = await sort(right) // 正数项排序 return sortLeft.concat(sortRight) } function sort(arr) { return new Promise((resolve) => { let len = arr.length const back = [] arr.forEach(item => { setTimeout(() => { back.push(item) len -= 1 if (len === 0) { resolve(back) // 完成排序 } }, item) // 以每个项作为时间 }) }) } ;(async () => { document.body.innerHTML = 'Before: ' + numbers.join(', ') + '<br>After: ' + (await sortArr(numbers)).join(', ') })() // 排序结果: [-767, -3, -1, 0, 3, 4, 8, 9, 89, 111, 999]
大名鼎鼎的睡眠排序🙃
这是边睡觉边排序啊
原理就是将要排序的数组的每一个项作为
setTimeout
时间参数,然后就可以排序了排序时间跟数组最大值绝对值有关 :)
需要对数组的负数项做一下处理,因为
setTimeout
参数负数的话跟参数 0 是一样的例子 JSFiddle
具体代码说明: