快排

136 阅读1分钟
function sortArray(nums) {
  randomizedQuicksort(nums, 0, nums.length - 1)
  return nums
}

function randomizedQuicksort(nums = [], l, r) {
  if (l < r) {
    let pos = randomizedPartition(nums, l, r)
    randomizedQuicksort(nums, l, pos - 1)
    randomizedQuicksort(nums, pos + 1, r)
  }
}
function randomizedPartition(nums = [], l, r) {
  let i =  parseInt(Math.random() * (r - l + 1))+ l // 随机选一个作为我们的主元
  swap(nums, r, i)
  return partition(nums, l, r)
}

function partition(nums = [], l, r) {
  let pivot = nums[r]
  let i = l - 1  //改成 i =l 会无限划分然后爆栈
  for (let j = l; j <= r - 1; ++j) {
    if (nums[j] <= pivot) {
      i = i + 1
      swap(nums, i, j)
    }
  }
  swap(nums, i + 1, r)
  return i + 1
}

function swap(nums = [], i, j) {
  let temp = nums[i]
  nums[i] = nums[j]
  nums[j] = temp
}
function sortArray(nums) {
  randomizedQuicksort(nums, 0, nums.length - 1)
  return nums
}

function randomizedQuicksort(nums = [], l, r) {
  if (l < r) {
    let pos = randomizedPartition(nums, l, r)
    randomizedQuicksort(nums, l, pos - 1)
    randomizedQuicksort(nums, pos + 1, r)
  }
}
function randomizedPartition(nums = [], l, r) {
  let i =  parseInt(Math.random() * (r - l + 1))+ l // 随机选一个作为我们的主元
  swap(nums, r, i)
  return partition(nums, l, r)
}

function partition(nums = [], l, r) {
  let pivot = nums[r]
  let pointer = l
  for (let j = l; j <= r - 1; j++) {
    if (nums[j] <= pivot) {
      swap(nums, pointer, j)
      pointer++
    }
  }
  swap(nums, pointer, r)
  return pointer
}

function swap(nums = [], i, j) {
  let temp = nums[i]
  nums[i] = nums[j]
  nums[j] = temp
}