// 交换 arr[i] 和 arr[j]
void swap(vector<int> &arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// 随机数获取: 左闭右闭区间
int random_l_r(int l, int r) {
static std::random_device rd;
static std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(l, r);
return dis(gen);
}
时间复杂度O(N^2),额外空间复杂度O(1)
void bubble_sort(vector<int> &arr) {
size_t n = arr.size();
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n - i - 1; ++j) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
时间复杂度O(N^2),额外空间复杂度O(1)
void select_sort(vector<int> &arr) {
size_t n = arr.size();
// 从 0 到 n-2,每次找到最小值,然后替换位置;n-1只剩一个,所以不用换
for (int i = 0; i < n - 1; ++i) {
int min_idx = i;
for (int j = i + 1; j < n; ++j) {
if (arr[min_idx] > arr[j]) {
min_idx = j;
}
}
swap(arr, i, min_idx);
}
}
时间复杂度O(N^2),额外空间复杂度O(1)
void insert_sort(vector<int> &arr) {
size_t n = arr.size();
for (int i = 1; i < n; ++i) {
// 下一张手牌,要往前找到合适的位置插入
for (int j = i; arr[j - 1] > arr[j] && j > 0; --j) { // 插入方式就是往前一直交换,直到遇到比自己小的才停止
swap(arr, j - 1, j);
}
}
}
时间复杂度O(N*logN),额外空间复杂度O(N)
void merge(vector<int> &arr, int l, int mid, int r) {
// 边界1: 注意数组大小
int n = r - l + 1;
vector<int> help(n);
// 归并排序合并,两部分都是各自已经排好序的
int i = 0;
int p1 = l;
int p2 = mid + 1;
// 双指针往后走,任一指针走完结束
while (p1 <= mid && p2 <= r) {
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= mid) {
help[i++] = arr[p1++];
}
while (p2 <= mid) {
help[i++] = arr[p2++];
}
// 边界2: 注意复制的起始点
// 替换方案: copy(help.begin(), help.end(), arr.begin() + l);
for (int j = 0; j < n; ++j) {
arr[l + j] = help[j];
}
}
// 二分
void merge_sort(vector<int> &arr, int l, int r) {
// 边界3: 注意 l 和 r 的判断,至少也应该判断&跳过 l == r 的情况
if (l < r) {
int mid = l + (r - l) / 2;
merge_sort(arr, l, mid);
merge_sort(arr, mid + 1, r);
merge(arr, l, mid, r);
}
}
// 归并排序
void merge_sort(vector<int> &arr) {
merge_sort(arr, 0, arr.size() - 1);
}
随机快速排序的复杂度分析
时间复杂度O(N*logN),额外空间复杂度O(logN)
// 核心分区逻辑
vector<int> partition(vector<int> &arr, int l, int r) {
int less = l - 1;// 小于区的右边界
int more = r; // 大于区的左边届
while (l < more) {
if (arr[l] < arr[r]) {// 小于区
swap(arr, ++less, l++);
} else if (arr[l] > arr[r]) {
swap(arr, --more, l);
} else {
++l;
}
}
swap(arr, more, r);
return vector<int>{less, more + 1};
}
void quick_sort(vector<int> &arr, int l, int r) {
if (l < r) {
// 随机数生成
int ran = random_l_r(l, r);
// 以随机数为基准
swap(arr, ran, r);
// 计算 partition 数组
vector<int> p = partition(arr, l, r);
quick_sort(arr, l, p[0]);
quick_sort(arr, p[1], r);
}
}
// 快速排序
void quick_sort(vector<int> &arr) {
if (arr.empty()) return;
quick_sort(arr, 0, arr.size() - 1);
}
时间复杂度O(N*logN),额外空间复杂度O(1)