快速排序
- 先从数列中取出一个数作为基准数
- 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边
- 再对左右区间重复第二步,直到各区间只有一个数
function quick_sort_v1(arr, l, r) {
if (l >= r) return
let x = l, y = r, base = arr[l]
while (x < y) {
while (x < y && arr[y] >= base) y--
if (x < y) arr[x++] = arr[y]
while (x < y && arr[x] <= base) x++
if (x < y) arr[y--] = arr[x]
}
arr[x] = base
quick_sort_v1(arr, l, x - 1)
quick_sort_v1(arr, x + 1, r)
}
function quick_sort_v2(arr, l, r) {
while (l < r) {
if (l >= r) return
let x = l, y = r, base = arr[l]
while (x < y) {
while (x < y && arr[y] >= base) y--
if (x < y) arr[x++] = arr[y]
while (x < y && arr[x] <= base) x++
if (x < y) arr[y--] = arr[x]
}
arr[y] = base
quick_sort_v2(arr, x + 1, r)
r = x - 1
}
}
const threshold = 16
function median(a, b, c) {
if (a > b) [a, b] = [b, a]
if (a > c) [a, c] = [c, a]
if (b > c) [b, c] = [c, b]
return b
}
function __quick_sort_v3(arr, l, r) {
while (r - l > threshold) {
let x = l, y = r, base = median(arr[l], arr[(l + r) / 2], arr[r])
do {
while (arr[x] < base) { x++ }
while (arr[y] > base) { y-- }
if (x <= y) {
[arr[x], arr[y]] = [arr[y], arr[x]]
x++
y--
}
} while (x <= y)
__quick_sort_v3(arr, x, r)
r = y
}
}
function final_insert_sort(arr, l, r) {
let ind = l
for (let i = l + 1; i <= r; i++) {
if (arr[i] < arr[ind]) {
ind = i
}
}
while (ind > l) {
[arr[ind], arr[ind - 1]] = [arr[ind - 1], arr[ind]]
--ind
}
for (let i = l + 2; i <= r; i++) {
let j = i
while (arr[j] < arr[j - 1]) {
[arr[j], arr[j - 1]] = [arr[j - 1], arr[j]]
j--
}
}
}
function quick_sort_v3(arr, l, r) {
__quick_sort_v3(arr, l, r)
final_insert_sort(arr, l, r)
}
LeetCode肝题
-
- 排序数组
function median(a, b, c) {
if (a > b) [a, b] = [b, a]
if (a > c) [a, c] = [c, a]
if (b > c) [b, c] = [c, b]
return b
}
function quick_sort_v2(arr, l, r) {
while (l < r) {
if (l >= r) return
let x = l, y = r, base = arr[l]
while (x < y) {
while (x < y && arr[y] >= base) y--
if (x < y) arr[x++] = arr[y]
while (x < y && arr[x] <= base) x++
if (x < y) arr[y--] = arr[x]
}
arr[y] = base
quick_sort_v2(arr, x + 1, r)
r = x - 1
}
}
var sortArray = function(nums) {
quick_sort_v2(nums, 0, nums.length-1)
return nums
};
-
- 排序链表
var sortList = function(head) {
if(!head) return head
let p = head, q, min = p.val, max = p.val, base = 0, ret1 = null, ret2 = null
while(p) {
min = Math.min(min, p.val)
max = Math.max(max, p.val)
p = p.next
}
if (min == max) return head
base = (max + min) / 2
p = head
while(p) {
q = p.next
if (p.val <= base) {
p.next = ret1
ret1 = p
} else {
p.next = ret2
ret2 = p
}
p = q
}
ret1 = sortList(ret1)
ret2 = sortList(ret2)
p = ret1
while(p.next) p = p.next
p.next = ret2
return ret1
};
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
var exchange = function(nums) {
let i = 0, j = nums.length - 1
while(i < j) {
while(nums[i] % 2 == 1 && i < j) i++
while(nums[j] % 2 == 0 && i < j) j--
if (i == j) break
[nums[i], nums[j]] = [nums[j], nums[i]]
i++
j--
}
return nums
};
-
- 颜色分类
var sortColors = function(nums) {
if (nums.length <= 1) return nums
let l = -1, r = nums.length, i = 0, base = 1
while(i < r) {
if (nums[i] == base) {
i++
} else if (nums[i] < base) {
l++
[nums[i], nums[l]] = [nums[l], nums[i]]
i++
} else {
r--
[nums[i], nums[r]] = [nums[r], nums[i]]
}
}
};
- 面试题 17.14. 最小K个数
function median(a, b, c) {
if (a > b) [a, b] = [b, a]
if (a > c) [a, c] = [c, a]
if (b > c) [b, c] = [c, b]
return b
}
function quick_sort_v2(arr, l, r) {
while (l < r) {
if (l >= r) return
let x = l, y = r, base = arr[l]
while (x < y) {
while (x < y && arr[y] >= base) y--
if (x < y) arr[x++] = arr[y]
while (x < y && arr[x] <= base) x++
if (x < y) arr[y--] = arr[x]
}
arr[y] = base
quick_sort_v2(arr, x + 1, r)
r = x - 1
}
}
var smallestK = function(arr, k) {
let ans = []
if (k == 0) return ans
quick_sort_v2(arr, 0, arr.length - 1)
while(k) ans.push(arr[--k])
return ans
};
-
- 不同的二叉搜索树 II
var dfs = function(l, r) {
let ans = []
if (l > r) {
ans.push(null)
return ans
}
for (let i = l; i <= r; i++) {
let left_tree = dfs(l, i - 1)
let right_tree = dfs(i + 1, r)
for (let leftItem of left_tree){
for(let rightItem of right_tree) {
let treeNode = new TreeNode(i, leftItem, rightItem)
ans.push(treeNode)
}
}
}
return ans
}
var generateTrees = function(n) {
if(n == 0) return []
return dfs(1, n)
};
-
- 字符串解码
var decodeString = function(s) {
let numArr = [], strArr = [], num = 0, ans = ''
for(let item of s) {
if (item >= '0' && item <= '9') {
num = num * 10 + parseInt(item)
} else if (item == '[') {
strArr.push(ans)
ans = ''
numArr.push(num)
num = 0
} else if (item == ']') {
ans = strArr.pop() + ans.repeat(numArr.pop())
} else {
ans += item
}
}
return ans
};