常用、常考的排序算法大概有以下几种:
- O(N)
- 冒泡排序
- 插入排序
- 选择排序
- O(Nlon(N))
- 快速排序
- 堆排序
- 归并排序
- O(N+M)
- 计数排序
可以使用模板题进行训练:
1. 快速排序
模板
function quickSort(nums, l, r) {
if (l >= r) return;
const p = sort(nums, l, r);
quickSort(nums, l, p);
quickSort(nums, p + 1, r);
}
function sort(nums, l, r) {
const mv = nums[(l + r) >> 1];
while (l <= r) {
while (nums[l] < mv) l++;
while (nums[r] > mv) r--;
if (l === r) break;
if (l < r) {
[nums[l], nums[r]] = [nums[r], nums[l]];
l ++;
r --;
}
}
return r;
}
题目
- 912. 排序数组 ---> 题解
- 215. 数组中的第K个最大元素 ---> 题解
2. 计数排序
概述
计数排序要求输入的数据必须是有确定范围的整数。将输入的数据作为key存储在额外的数组中,然后依次把计数大于1的填充回原数组
- 时间复杂度
O(N + M), N 为元素个数, M 为数值范围
题目
- 1122. 数组的相对排序 ---> 题解
- 347. 前 K 个高频元素 ---> 题解
3. 归并排序
模板
function mergeSort(nums, l, r) {
if (l >= r) return;
const mid = (l + r) >> 1;
mergeSort(nums, l, mid);
mergeSort(nums, mid + 1, r);
merge(nums, l, mid, r);
}
function merge(nums, l, mid, r) {
let lp = l;
let rp = mid + 1;
const temp = new Array(r - l + 1).fill(0);
for (let i = 0; i < temp.length; i++) {
if (rp > r || (lp <= mid && nums[lp] <= nums[rp])) {
temp[i] = nums[lp++];
} else {
temp[i] = nums[rp++];
}
}
for (let i = 0; i < temp.length; i++) {
nums[l + i] = temp[i]
}
}
题目
- 493. 翻转对 ---> 题解
- 剑指 Offer 51. 数组中的逆序对 ---> 题解