排序
跳到导航
跳到搜索
排序算法是计算机科学中最基本也是最重要的问题之一。它们的目标是将一组无序的数据按某种规则(如从小到大)排列。良好的排序算法能提升系统效率,减少查找和访问成本。
排序算法 | Sorting algorithms | 时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 排序方式 | 稳定性 | 实现年代 |
选择排序 | Selection Sort | O(n²) | O(n²) | O(n²) | O(1) | In-place | 不稳定 | 古典算法 |
插入排序 | Insertion Sort | O(n²) | O(n) | O(n²) | O(1) | In-place | 稳定 | 古典算法 |
冒泡排序 | Bubble Sort | O(n²) | O(n) | O(n²) | O(1) | In-place | 稳定 | 1956 年 |
希尔排序 | Shell Sort | O(n log n) | O(n log² n) | O(n log² n) | O(1) | In-place | 不稳定 | 1959 年 |
归并排序 | Merge Sort | O(n log n) | O(n log n) | O(n log n) | O(n) | Out-place | 稳定 | 1945 年 |
快速排序 | Quick Sort | O(n log n) | O(n log n) | O(n²) | O(log n) | In-place | 不稳定 | 1960 年 |
堆排序 | Heap Sort | O(n log n) | O(n log n) | O(n log n) | O(1) | In-place | 不稳定 | 1964 年 |
计数排序 | Counting Sort | O(n + k) | O(n + k) | O(n + k) | O(k) | Out-place | 稳定 | 1954 年 |
桶排序 | Heap Sort | O(n + k) | O(n + k) | O(n²) | O(n + k) | Out-place | 稳定 | 1972 年 |
基数排序 | Radix Sort | O(n × k) | O(n × k) | O(n × k) | O(n + k) | Out-place | 稳定 | 1887 年 |
Timsort | Timsort | O(n log n) | O(n) | O(n log n) | O(n) | Out-place | 稳定 | 2002 年 |
冒泡排序
void bubbleSort(vector<int>& arr) { int n = arr.size(); bool swapped = false; for (int i = 0; i < n - 1; ++i) { swapped = false; for (int j = 0; j < n - i - 1; ++j) { if (arr[j] > arr[j + 1]) { swap(arr[j], arr[j + 1]); swapped = true; } } if (!swapped) break; } }
插入排序
void insertionSort(vector<int>& arr) { for (int i = 1; i < arr.size(); ++i) { int key = arr[i], j = i - 1; while (j >= 0 && arr[j] > key) arr[j + 1] = arr[j--]; arr[j + 1] = key; } }
快速排序
int partition(vector<int>& arr, int low, int high) { int pivot = arr[high], i = low - 1; for (int j = low; j < high; ++j) { if (arr[j] < pivot) swap(arr[++i], arr[j]); } swap(arr[i + 1], arr[high]); return i + 1; } void quickSort(vector<int>& arr, int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } }
归并排序
void merge(vector<int>& arr, int left, int mid, int right) { vector<int> leftArr(arr.begin() + left, arr.begin() + mid + 1); vector<int> rightArr(arr.begin() + mid + 1, arr.begin() + right + 1); int i = 0, j = 0, k = left; while (i < leftArr.size() && j < rightArr.size()) { arr[k++] = (leftArr[i] <= rightArr[j]) ? leftArr[i++] : rightArr[j++]; } while (i < leftArr.size()) arr[k++] = leftArr[i++]; while (j < rightArr.size()) arr[k++] = rightArr[j++]; } void mergeSort(vector<int>& arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); merge(arr, left, mid, right); } }
堆排序
void heapify(vector<int>& arr, int n, int i) { int largest = i, l = 2*i + 1, r = 2*i + 2; if (l < n && arr[l] > arr[largest]) largest = l; if (r < n && arr[r] > arr[largest]) largest = r; if (largest != i) { swap(arr[i], arr[largest]); heapify(arr, n, largest); } } void heapSort(vector<int>& arr) { int n = arr.size(); for (int i = n/2 - 1; i >= 0; --i) heapify(arr, n, i); for (int i = n - 1; i >= 0; --i) { swap(arr[0], arr[i]); heapify(arr, i, 0); } }