小工具知识网

当前位置: 首页 > 行业知识 > 排序算法总结

行业知识

排序算法总结

2026-11-11 18:14:09 来源:互联网转载

排序算法分类

  • 基于���较的排序
    • 通过比较大小来决定元素间的相对次序。
    • 可以证明时间复杂度下界为 O ( n l o g n ) O(nlogn) O(nlogn),不可能突破这个复杂度达到更快。
    • 非比较类排序
      • 不通过比较大小来决定元素间的相对次序。
      • 时间复杂度受元素的范围以及分布等多种因素影响,不单纯取决于元素数量 N。

        比较类排序

        • 选择排序
          • 简单选择排序
            • 每次从未排序数据中找最小值,放到已排序序列的末尾。
            • 时间复杂度 O ( n 2 ) O(n^2) O(n2)。
              for(int i = 0;i  
            • 堆排序
              • 利用二叉堆高效地选出最小值,建立一个包含所有 n n n 个元素的二叉堆,重复 n n n 次从堆中取出最小值,即可得到有序序列。
              • 时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)。
                void heap_sort(int a[], int n) {priority_queue q;for(int i = 0;i  
              • 插入排序
                • 简单插入排序
                  • 从前到后依次考虑每个未排序数据,在已排序序列中找到合适位置插入。
                  • 时间复杂度 O ( n 2 ) O(n^2) O(n2)。
                    for(int i = 1;i = 0 && nums[pre_index] > current) {nums[pre_index + 1] = nums[pre_index];pre_index--;}nums[pre_index + 1] = current; }
                  • 希尔排序
                    • 希尔排序是对插入排序的优化 – 增量分组插入排序。
                    • 时间复杂度取决于增量序列(步长序列)的选取,最好序列可以做到 N 4 3 N^\frac43 N34​ 或 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)。
                    • 交换排序
                      • 冒泡排序
                        • 不断循环扫描,每次查看相邻的元素,如何逆序,则交换。
                        • 时间复杂度 O ( n 2 ) O(n^2) O(n2)。
                          for(int i = 0;i  nums[j + 1]) {int temp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = temp;}}}
                        • 快速排序
                          • 快速排序也是一个基于分治的算法。
                          • 从数组中选取中轴元素 pivot。
                          • 将小元素放在 pivot 左边,大元素放在右边。
                          • 然后分别对左边和右边的子数组进行快排。
                          • 快速排序和归并排序具有相似性,但步骤顺序相反。
                            • 归并排序:先排序左右子数组,然后合并两个有序数组。
                            • 快速排序:先调配出左右子数组,然后对左右子数组分别进行排序。
                            • 随机选取 pivot,期望时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn),最坏 O ( n 2 ) O(n^2) O(n2)
                              void quickSort(vector& arr, int left, int right) {if (left >= right) return;int pivot = partition(arr, left, right);quickSort(arr, left, pivot);quickSort(arr, pivot + 1, right);}int partition(vector& arr, int left, int right) {int pivot = left + rand() % (right - left + 1);int pivotVal = arr[pivot];while(left while(arr[left]  
                            • 归并排序
                              • 归并排序是一个基于分治的算法。
                              • 时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn) 。
                              • 原问题:把数组排序。
                              • 子问题:把数组前一半、后一半分别排序,然后再合并左右两半(两个有序数组)就可以了。
                                void mergeSort(vector& arr, int l, int r) {if (l >= r) return;int mid = (l + r) >> 1;mergeSort(arr, l, mid);mergeSort(arr, mid + 1, r);return merge(arr, l, mid, r);}void merge(vector& arr, int left, int mid, int right) {vector tmp = vector(right - left + 1); // 临时数组int i = left, j = mid + 1;for(int k = 0;k  right || (i  // 合并两个有序数组tmp[k] = arr[i++];} else {tmp[k] = arr[j++];}}for (int k = 0;k 

上一篇:揭秘MOD运算,概念、应用与实例深度解析

下一篇:开源通讯服务器怎么用手机?