排序与查找
掌握经典排序、查找算法及其高频应用
60%
🔢 常用排序算法
🔍 查找算法
🌟 典型例题与完整解答
💡 练习题与参考答案
常用排序算法
掌握经典排序算法的原理与实现:
// 冒泡排序(每轮将最大/最小元素"冒泡"到末尾)
void bubbleSort(vector<int>& a) {
int n = a.size();
for (int i = 0; i < n - 1; ++i) {
bool swapped = false; // 标记本轮是否有交换
for (int j = 0; j < n - 1 - i; ++j) {
if (a[j] > a[j + 1]) {
swap(a[j], a[j + 1]);
swapped = true;
}
}
if (!swapped) break; // 已有序提前结束
}
}
// 选择排序(每轮选择最小元素放到前面)
void selectionSort(vector<int>& a) {
int n = a.size();
for (int i = 0; i < n - 1; ++i) {
int minIdx = i;
for (int j = i + 1; j < n; ++j)
if (a[j] < a[minIdx]) minIdx = j;
swap(a[i], a[minIdx]);
}
}
// 插入排序(将当前元素插入到前面有序区间)
void insertionSort(vector<int>& a) {
int n = a.size();
for (int i = 1; i < n; ++i) {
int x = a[i], j = i - 1;
while (j >= 0 && a[j] > x) {
a[j + 1] = a[j];
--j;
}
a[j + 1] = x;
}
}
// 归并排序(分治,递归排序左右两半并合并)
void merge(vector<int>& a, int l, int m, int r) {
vector<int> tmp(r - l + 1);
int i = l, j = m + 1, k = 0;
while (i <= m && j <= r)
tmp[k++] = a[i] < a[j] ? a[i++] : a[j++];
while (i <= m) tmp[k++] = a[i++];
while (j <= r) tmp[k++] = a[j++];
for (int t = 0; t < tmp.size(); ++t) a[l + t] = tmp[t];
}
void mergeSort(vector<int>& a, int l, int r) {
if (l >= r) return;
int m = l + (r - l) / 2;
mergeSort(a, l, m);
mergeSort(a, m + 1, r);
merge(a, l, m, r);
}
// 快速排序(分治,选基准分区递归排序)
int partition(vector<int>& a, int l, int r) {
int pivot = a[r], i = l - 1;
for (int j = l; j < r; ++j) {
if (a[j] <= pivot) swap(a[++i], a[j]);
}
swap(a[i + 1], a[r]);
return i + 1;
}
void quickSort(vector<int>& a, int l, int r) {
if (l < r) {
int p = partition(a, l, r);
quickSort(a, l, p - 1);
quickSort(a, p + 1, r);
}
}
// 堆排序(利用大根堆/小根堆,每次取堆顶)
void heapify(vector<int>& a, int n, int i) {
int largest = i, l = 2 * i + 1, r = 2 * i + 2;
if (l < n && a[l] > a[largest]) largest = l;
if (r < n && a[r] > a[largest]) largest = r;
if (largest != i) {
swap(a[i], a[largest]);
heapify(a, n, largest);
}
}
void heapSort(vector<int>& a) {
int n = a.size();
for (int i = n / 2 - 1; i >= 0; --i) heapify(a, n, i); // 建堆
for (int i = n - 1; i > 0; --i) {
swap(a[0], a[i]);
heapify(a, i, 0);
}
}