You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript递归中使用async函数实现带sleep动画的快速排序出错求助

问题原因

async 函数的返回值会自动封装为 Promise 对象,你现有代码中的sort_q、quick_sort都是同步执行逻辑,不会等待partition内部的异步操作(也就是sleep和动画逻辑)执行完成,就直接拿未 resolve 的 Promise 对象当下标使用,同时后续递归排序也会提前执行,此时数组还未完成当前轮次的分区交换,最终导致排序结果错误。

修复步骤
  • 给所有调用异步函数的上层递归函数添加async修饰符,调用partition时添加await关键字等待异步执行完成,拿到正确的分区下标后再执行后续递归
  • 给入口函数quick_sort也添加async修饰符,等待整个排序递归完成后再打印最终结果
  • 确保你引入的sleep函数是符合标准的 Promise 实现(示例:const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)))
修复后完整代码
// 保证sleep是返回Promise的实现
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
const MAX_SLEEP_TIME = 2000
let random_numbers = [] // 你的全局随机数数组
const number_of_box = 10
// 假设你的swap_values、swap_boxes_sq函数已经正确实现
function swap_values(a, b) {
  [random_numbers[a], random_numbers[b]] = [random_numbers[b], random_numbers[a]]
}
function swap_boxes_sq(a, b) {
  // 你的动画逻辑
}

async function partition(low, high) {
  var pivot = random_numbers[low];
  var i = low+1;
  var j = high;

  while (i <= j){
    if (random_numbers[i] < pivot){
        i++;
    }else{
        swap_values(i, j);
        swap_boxes_sq(i, j);
        await sleep(MAX_SLEEP_TIME);
        j--;
    }
  }

  swap_values(low, i-1);      
  return i-1;
}

// 加async修饰
async function sort_q(low, high) {
  if (low < high){
    // 等待partition执行完成拿到正确下标
    var pi = await partition(low, high);
    // 递归调用也要await,保证前半部分排序完成再排后半部分
    await sort_q(low, pi-1);
    await sort_q(pi+1, high);
  } 
}

// 加async修饰
async function quick_sort() {
  let low = 0;
  let high = number_of_box -1;
  // 等待整个排序完成
  await sort_q(low, high);
  console.log(random_numbers);
}

// 调用入口,也可以用.then处理排序完成后的后续逻辑
// quick_sort()

内容的提问来源于stack exchange,提问作者Gaurav Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:33:00