查看“排序”的源代码
←
排序
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
排序算法是计算机科学中最基本也是最重要的问题之一。它们的目标是将一组无序的数据按某种规则(如从小到大)排列。良好的排序算法能提升系统效率,减少查找和访问成本。 {| class="wikitable" |排序算法 |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 年 |} === 冒泡排序 === <small><small><nowiki>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; } }</nowiki></small></small> === 插入排序 === <small><small><nowiki>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; } }</nowiki></small></small> === 快速排序 === <small><small><nowiki>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); } }</nowiki></small></small> === 归并排序 === <small><small><nowiki>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); } }</nowiki></small></small> === 堆排序 === <small><small><nowiki>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); } }</nowiki></small></small> [[分类:Develop]] [[分类:C++]]
返回
排序
。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
目录
文章分类
侧边栏
帮助
工具
链入页面
相关更改
特殊页面
页面信息