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

异步QuickSort函数仅完成首次分区后停止工作问题排查

问题原因及解决方案

核心问题

把quickSort_part声明为async后,它的返回值不再是普通的分区索引,而是Promise对象。如果原quickSort函数没有等待这个Promise完成就执行后续逻辑,拿到的会是未resolved的Promise而非实际索引值,导致后续递归无法触发,看起来就像首次分区后停止工作。

具体修复步骤

  1. 将quickSort改为async函数
    因为它调用了async的分区函数,必须用await等待分区结果,所以自身也要变成async:

    async function quickSort(arr, low, high) {
      if (low < high) {
        // 用await获取实际分区索引,而非Promise
        const pi = await quickSort_part(arr, low, high);
        // 递归调用也要用await保证顺序执行
        await quickSort(arr, low, pi - 1);
        await quickSort(arr, pi + 1, high);
      }
    }
    
  2. 保证quickSort_part返回正确值
    即使没加延迟,async函数也会把return的值包装成Promise返回,确保它最终返回的是分区索引:

    async function quickSort_part(arr, low, high) {
      const pivot = arr[high];
      let i = low - 1;
      for (let j = low; j < high; j++) {
        if (arr[j] < pivot) {
          i++;
          [arr[i], arr[j]] = [arr[j], arr[i]];
        }
      }
      [arr[i + 1], arr[high]] = [arr[high], arr[i + 1]];
      // 返回分区索引,async自动包装为Promise
      return i + 1;
    }
    
  3. 调用quickSort时处理Promise
    现在quickSort是async函数,调用时需要用await或.then()处理完成状态:

    // 示例调用
    (async function() {
      const arr = [10, 7, 8, 9, 1, 5];
      await quickSort(arr, 0, arr.length - 1);
      console.log("排序完成:", arr);
    })();
    

后续添加延迟的注意事项

要实现动画效果,直接在quickSort_part的关键步骤(比如交换元素后)调用返回Promise的sleep函数即可:

async function quickSort_part(arr, low, high) {
  const pivot = arr[high];
  let i = low - 1;
  for (let j = low; j < high; j++) {
    if (arr[j] < pivot) {
      i++;
      [arr[i], arr[j]] = [arr[j], arr[i]];
      // 交换后加延迟,用于更新UI动画
      await sleep(100);
    }
  }
  [arr[i + 1], arr[high]] = [arr[high], arr[i + 1]];
  await sleep(100);
  return i + 1;
}

// 标准sleep实现
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

内容的提问来源于stack exchange,提问作者Viraj Doshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:05:19