quick sort 快速排序

70 阅读1分钟

快排思想

  1. 原地排序
  2. 第一次取首部 start = 0 end = nums.length
  3. 当 start < end 时进行 partition
  4. partition 即 取数组的第一个值 作为 pivot,循环遍历数组 start -> start
  5. 设置两个指针 slow, fast, slow = start,fast = slow + 1 如果遍历过程中发现小于 pivot的值,则进行 i++操作后,调换位置 swap(arr, i, j)
  6. 最后 slow 指针即指定了 pivot所在位置所以再次交换位置,swap(arr, pivot, slow),最后将slow返回
  7. 对已经划分好的两部分内容 small部分 quickSort(arr, start, p),和bigger部分 quickSort(arr, p + 1, end)进行递归操作即可
const swap = (arr, i, j) => {
    [arr[i], arr[j]] = [arr[j], arr[i]]
}
const partition = (arr, start, end) => {
    const pivot = arr[start]
    let i = start
    for (let j = i + 1; j < end; j++) {
        if (arr[j] < pivot) {
            i++
            swap(arr, i, j)
        }
    }
    swap(arr, start, i)
    return i

}
function quickSort(arr, start, end) {
    if (start < end) {
        const p = partition(arr, start, end)
        quickSort(arr, start, p)
        quickSort(arr, p + 1, end)
    }
}

function sortArray(nums) {
    quickSort(nums, 0, nums.length)
    return nums
}

简易写法


function quickSort (items) {
  const length = items.length

  if (length <= 1) {
    return items
  }
  const PIVOT = items[0]
  const GREATER = []
  const LESSER = []

  for (let i = 1; i < length; i++) {
    if (items[i] > PIVOT) {
      GREATER.push(items[i])
    } else {
      LESSER.push(items[i])
    }
  }

  const sorted = [...quickSort(LESSER), PIVOT, ...quickSort(GREATER)]
  return sorted
}