LoeiFy / Recordum

GitHub issues blog
MIT License
33 stars 6 forks source link

使用 setTimeout 排序 #20

Open LoeiFy opened 7 years ago

LoeiFy commented 7 years ago

原理就是将要排序的数组的每一个项作为 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]
kuige commented 4 years ago

大名鼎鼎的睡眠排序🙃

ChenYFan commented 3 years ago

这是边睡觉边排序啊