Skip to content
On this page

快排与三路快排

快排

export let quickSort = (arr, left, right) => {
  var len = arr.length,
        partitionIndex,
        left = typeof left != 'number' ? 0 : left,
        right = typeof right != 'number' ? len - 1 : right;

    if (left < right) {
        partitionIndex = partition(arr, left, right);
        quickSort(arr, left, partitionIndex-1);
        quickSort(arr, partitionIndex+1, right);
    }
    return arr;
}

const partition = (arr, left, right) => {
  let pivot = left, index = pivot + 1, key = index
  for (let i = index; i <= right; i++) {
    if (arr[i] < arr[pivot]) {
      swap(arr, i, key)
      key++
    }
  }
  swap(arr, pivot, key - 1)
  return key - 1
}
const swap = (arr, i, j) => {
  var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
let quickSort1 = (arr, left, right) => {
  left = typeof left != 'number' ? 0 : left
  right = typeof right != 'number' ? arr.length - 1 : right
  if (left >= right) return arr
  let index = left + 1, key = index
  while(index <= right) {
    if (arr[index] < arr[left]) {
      swap(arr, index, key)
      key++
    }
    index++
  }
  swap(arr, left, key - 1)
  quickSort1(arr, left, key - 2)
  quickSort1(arr, key, right)
  return arr
}

三路快排

let quickSort2 = (arr, left, right) => {
  left = typeof left === 'number' ? left :0
  right = typeof right === 'number' ? right : arr.length - 1
  let lt = left, index = lt + 1,rt = right + 1
  if (right < left) return arr


  while(index < rt) {
    if (arr[index] < arr[left]) {
      swap(arr, lt+1, index)
      lt++
      index++
    } else if(arr[index] > arr[left]) {
      swap(arr, rt-1, index)
      rt--
    } else {
      index++
    }
  }
  swap(arr, lt, left)
  quickSort2(arr, left, lt -1)
  quickSort2(arr, rt, right)
  return arr
}
let swap = (arr, i, j) => {
  [arr[i], arr[j]] = [arr[j], arr[i]]
}

MIT License.