template<typename T> voidbubbleSort(vector<T>& arr, int n){ for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j + 1] < arr[j]) { swap(arr[j + 1], arr[j]); } } } }
最坏时间复杂度:O(n²) 在逆序的情况下,外层和内层循环都会遍历数组,导致平方级别的时间开销 最好时间复杂度:O(n) 如果数组已经是有序的,在这种情况下,算法只会进行一次遍历,比较次数为 n - 1 次,且不需要任何交换 空间复杂度:O(1)
优点 1、简单 2、稳定性
选择排序(Selection Sort)
原理: 从未排序的部分中选择最小的元素,并将其与未排序部分的第一个元素交换
1 2 3 4 5 6 7 8 9 10 11 12
template<typename T> voidselectionSort(vector<T>& arr, int n){ for (int i = 0; i < n - 1; i++) { int min = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[min]) { min = j; } swap(arr[i], arr[min]); } } }
voidquick_sort(int q[], int l, int r) { if (l == r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while(i < j){ do i++; while(q[i] < x); do j--; while(q[j] > x); if (i < j) swap(q[i], q[j]); } quick_sort(q, l, j); quick_sort(q, j + 1, r); }
归并排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
voidmerge_sort(int arr[], int l, int r){ if (l == r) return; int temp[r + 1]; int mid = l + r >> 1; merge_sort(arr, l ,mid); merge_sort(arr, mid + 1, r); int k = 0, i = l, j = mid + 1; while(i <= mid && j <= r) { if (arr[i] <= arr[j]) temp[k++] = arr[i++]; else temp[k++] = arr[j++]; } while(i <= mid) temp[k++] = arr[i++]; while(j <= r) temp[k++] = arr[j++]; for (i = l, j = 0; i <= r; i++, j++) { arr[i] = temp[j]; } }