Skip to content

快速排序

套路

  • 选定中心轴 pivot

  • 将大于中心轴的数字放在 pivot 的右边

  • 将小于中心轴的数字放在 pivot 的左边

  • 分别对左右子序列重复前三步操作

js
function arraySort(target) {
  let result = [...target]
  /**
   * 单边排序任务
   */
  function sort(arr, start, end) {
    // 记录中心轴的数字
    const base = arr[start]
    let left = start
    let right = end
    while (left < right) {
      // 先移动右指针
      while (arr[right] >= base && left < right) {
        right--
      }
      // 到这一步说明右指针数字小于中心轴,此时右指针空置
      arr[left] = arr[right]
      // 开始移动左指针
      while (arr[left] < base && left < right) {
        left++
      }
      // 到这一步说明左指针数字大于中心轴,此时左指针空置
      arr[right] = arr[left]
      // continue // 进入下一轮循环
    }
    // 循环结束是left===right
    arr[left] = base
    return left // 返回此时的指针位置
  }
  /**
   * 主流程
   */
  function quickSort(arr, start, end) {
    if (start < end) {
      const mid = sort(arr, start, end)
      // 对左边排一次
      quickSort(arr, 0, mid)
      // 对右边排一次
      quickSort(arr, mid + 1, end)
    }
  }
  // 传入初始条件
  quickSort(result, 0, result.length - 1)
  return result
}
function arraySort(target) {
  let result = [...target]
  /**
   * 单边排序任务
   */
  function sort(arr, start, end) {
    // 记录中心轴的数字
    const base = arr[start]
    let left = start
    let right = end
    while (left < right) {
      // 先移动右指针
      while (arr[right] >= base && left < right) {
        right--
      }
      // 到这一步说明右指针数字小于中心轴,此时右指针空置
      arr[left] = arr[right]
      // 开始移动左指针
      while (arr[left] < base && left < right) {
        left++
      }
      // 到这一步说明左指针数字大于中心轴,此时左指针空置
      arr[right] = arr[left]
      // continue // 进入下一轮循环
    }
    // 循环结束是left===right
    arr[left] = base
    return left // 返回此时的指针位置
  }
  /**
   * 主流程
   */
  function quickSort(arr, start, end) {
    if (start < end) {
      const mid = sort(arr, start, end)
      // 对左边排一次
      quickSort(arr, 0, mid)
      // 对右边排一次
      quickSort(arr, mid + 1, end)
    }
  }
  // 传入初始条件
  quickSort(result, 0, result.length - 1)
  return result
}