C++算法(排序算法)
1. 冒泡排序(Bubble Sort)
时间复杂度:O(n²)
空间复杂度:O(1)
稳定性:稳定
原理:相邻元素两两比较,大的往后移动
void bubbleSort(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n - 1; i++) {
bool swapped = false;
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
swapped = true;
}
}
if (!swapped) break; // 优化:提前退出
}
}
2. 选择排序(Selection Sort)
时间复杂度:O(n²)
空间复杂度:O(1)
稳定性:不稳定
原理:每次从未排序部分选择最小元素,放到已排序部分末尾
void selectionSort(vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
swap(arr[i], arr[minIndex]);
}
}
}
3. 插入排序(Insertion Sort)
时间复杂度:O(n²),最好情况 O(n)
空间复杂度:O(1)
稳定性:稳定
原理:将未排序元素插入到已排序部分的正确位置
void insertionSort(vector<int>& arr) {
int n = arr.size();
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
4. 归并排序(Merge Sort)
时间复杂度:O(n log n)
空间复杂度:O(n)
稳定性:稳定
原理:分治法,将数组分成两半,递归排序后合并
void merge(vector<int>& arr, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
vector<int> L(n1), R(n2);
for (int i = 0; i < n1; i++)
L[i] = arr[left + i];
for (int j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k++] = L[i++];
} else {
arr[k++] = R[j++];
}
}
while (i < n1) arr[k++] = L[i++];
while (j < n2) arr[k++] = R[j++];
}
void mergeSortHelper(vector<int>& arr, int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSortHelper(arr, left, mid);
mergeSortHelper(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
void mergeSort(vector<int>& arr) {
mergeSortHelper(arr, 0, arr.size() - 1);
}
5. 快速排序(Quick Sort)
时间复杂度:平均 O(n log n),最坏 O(n²)
空间复杂度:O(log n)
稳定性:不稳定
原理:选择基准元素,将小于基准的放左边,大于的放右边,递归处理
int partition(vector<int>& arr, int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] < pivot) {
i++;
swap(arr[i], arr[j]);
}
}
swap(arr[i + 1], ar
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。
查看24道真题和解析