荷兰国旗
荷兰国旗问题,例如一个数组[1,4,3,5,6,7,2],给定一个num=2,把小于num的放左边,等于num的放中间,大于num的放右边。
function partition(arr, num) {
let cur = 0,
left = -1,
right = arr.length
while (cur < right) {
if (arr[cur] < num) {
//小于num 把这个数跟小于区域的下一个数交换 小于区域向右扩大一位 cur向右挪一位
swap(arr, ++left, cur++)
} else if (arr[cur] > num) {
//大于num 把这个数跟大于区域的前一个数交换 cur不动 继续考察换过来的这一个数 大于区域向左扩大一位
swap(arr, --right, cur)
} else {
cur++
}
}
}
function swap(arr, i, j) {
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
} 经典快排
相当于把数组的最后一个数当做num,递归partition操作。
function quickSort(arr, L, R) {
if (L < R) {
let a = partition(arr, L, R)
quickSort(arr, L, a[0] + 1)
quickSort(arr, a[1], R)
}
}
function partition(arr, L, R) {
let cur = L,
left = L - 1,
right = R,
target = arr[right - 1]
while (cur < right) {
if (arr[cur] < target) {
//小于num 把这个数跟小于区域的下一个数交换 小于区域向右扩大一位 cur向右挪一位
swap(arr, ++left, cur++)
} else if (arr[cur] > target) {
//大于num 把这个数跟大于区域的前一个数交换 cur不动 继续考察换过来的这一个数 大于区域向左扩大一位
swap(arr, --right, cur)
} else {
cur++
}
}
return [left, right]
}
function swap(arr, i, j) {
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
let arr = [7, 2, 1, 4, 3, 5, 6]
quickSort(arr, 0, arr.length)
console.log(arr)随机快排
先随机选一个数与最后一个数交换,再来做划分
只需在partition之前加上一句
swap(arr, L + Math.floor(Math.random() * (R - L)), R - 1)

京公网安备 11010502036488号