sort?

排序算法与思想总结

1.冒泡排序(bubble sort)

1
2
3
4
5
6
7
8
9
10
11
void bubbleSort(vector<int>& nums) {
int n = nums.size();

for(int i = 0; i < n - 1; i++) {
for(int j = 0; j < n - 1 - i; j++) {
if(nums[j] > nums[j + 1]) {
swap(nums[j], nums[j + 1]);
}
}
}
}

稳定

复杂度:

时间 $O(n^2)$

空间 $O(1)$

每一轮把最大的数“冒”到最后

不断交换相邻元素即可

so easy~

2.选择排序(selection sort)

每次找最小值放到前面

1
2
3
4
5
6
7
8
9
10
11
12
13
void selectionSort(vector<int>& nums) {
int n = nums.size();

for(int i = 0; i < n; i++) {
int minIndex = i;
for(int j = i + 1; j < n; j++) {
if(nums[j] < nums[minIndex]) {
minIndex = j;
}
}
swap(nums[i], nums[minIndex]);
}
}

复杂度依旧$O(n^2)$

不稳定

3.插入排序(insertion sort)

像打扑克牌一样不断插入到已排序部分~

1
2
3
4
5
6
7
8
9
10
11
void insertionSort(vector<int>& nums) {
for(int i = 1; i < nums.size(); i++) {
int key = nums[i];
int j = i - 1;
while(j >= 0 && nums[j] > key) {
nums[j + 1] = nums[j];
j--;
}
nums[j + 1] = key;
}
}

复杂度依旧$O(n^2)$

但如果数组基本有序

则为$O(n)$!

稳定

4.归并排序(merge sort)

分治思想

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void merge(vector<int>& nums, int l, int mid, int r) {
vector<int> temp;
int i = l, j = mid + 1;

while(i <= mid && j <= r) {
if(nums[i] < nums[j]) {
temp.push_back(nums[i++]);
}else {
temp.push_back(nums[j++]);
}
}
while(i <= mid) temp.push_back(nums[i++]);
while(j <= r) temp.push_back(nums[j++]);

for(int k = 0; k < temp.size(); k++) {
nums[l + k] = temp[k];
}
}

void mergeSort(vector<int>& nums, int l, int r) {
if(l >= r) return;
int mid = (l + r) / 2;

mergeSort(nums, l, mid);
mergeSort(nums, mid + 1, r);

merge(nums, l, mid, r);
}

复杂度:

时间 $O(n \log n)$

空间 $O(n)$

稳定

5.快速排序(quick sort)

经典

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int partition(vector<int>& nums, int l, int r) {
int pivot = nums[r];
int i = l;

for(int j = l; j < r; j++) {
if(nums[j] < pivot) {
swap(nums[i], nums[j]);
i++;
}
}
swap(nums[i], nums[r]);
return i;
}

void quickSort(vector<int>& nums, int l, int r) {
if(l >= r) return;

int p = partition(nums, l, r);

quickSort(nums, l, p - 1);
quickSort(nums, p + 1, r);
}

平均 $O(n \log n)$

最坏 $O(n^2)$

不稳定

6.堆排序(heap sort)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void heapify(nums<int>& nums, int n, int i) {
int largest = i;
int l = 2 * i + 1;
int r = 2 * i + 2;
if(l < n && nums[l] > nums[largest]) {
largest = l;
}
if(r < n && nums[r] > nums[largest]) {
largest = r;
}
if(largest != i) {
swap(nums[i], nums[largest]);
heapify(nums, n, largest);
}
}

void heapSort(vector<int>& nums) {
int n = nums.size();

for(int i = n / 2 - 1; i >= 0; i--) {
heapify(nums, n, i);
}

for(int i = n - 1; i > 0; i--) {
swap(nums[0], nums[i]);
heapify(nums, i, 0);
}
}

复杂度:

时间 $O(n \log n)$

空间 $O(1)$

不稳定

待补充…


sort?
https://roxy5201314.github.io/2026/03/06/sort/
作者
roxy
发布于
2026年3月6日
更新于
2026年3月6日
许可协议