• 排序算法总结


    排序方法最好平均最坏空间复杂度稳定性
    冒泡排序O(n)O(n^2)O(n^2)O(1)稳定
    直接插入排序O(n)O(n^2)O(n^2)O(1)稳定
    选择排序O(n^2)O(n^2)O(n^2)O(1)不稳定
    希尔排序O(n^1.3)O(n^1.5)O(1)不稳定
    堆排序O(n * log(n))O(n * log(n))O(n * log(n))O(1)不稳定
    快速排序O(n * log(n))O(n * log(n))O(n^2)O(log(n)) ~ O(n)不稳定
    归并排序O(n * log(n))O(n * log(n))O(n * log(n))O(n)稳定

    快速排序

    设要排序的数组是 A [ 0 ] … … A [ N − 1 ] A[0]……A[N-1] A[0]……A[N1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

    步骤:

    1. 设置两个变量 i 、 j i、j ij,排序开始的时候: i = 0 , j = N − 1 i=0,j=N-1 i=0j=N1
    2. 以第一个数组元素作为关键数据,赋值给 k e y key key,即 k e y = A [ 0 ] key=A[0] key=A[0]
    3. j j j开始向前搜索,即由后开始向前搜索 ( j − − ) (j--) (j),找到第一个小于 k e y key key的值 A [ j ] A[j] A[j],将 A [ j ] A[j] A[j] A [ i ] A[i] A[i]的值交换;
    4. i i i开始向后搜索,即由前开始向后搜索 ( i + + ) (i++) (i++),找到第一个大于 k e y key key A [ i ] A[i] A[i],将 A [ i ] A[i] A[i] A [ j ] A[j] A[j]的值交换;
    5. 重复第3、4步,直到 i = = j i==j i==j;(3,4步中,没找到符合条件的值,即3中 A [ j ] A[j] A[j]不小于 k e y key key,4中 A [ i ] A[i] A[i]不大于 k e y key key的时候改变 j 、 i j、i ji的值,使得 j = j − 1 , i = i + 1 j=j-1,i=i+1 j=j1i=i+1,直至找到为止。找到符合条件的值,进行交换的时候 i , j i, j ij指针位置不变。另外, i = = j i==j i==j这一过程一定正好是 i + i+ i+ j − j- j完成的时候,此时令循环结束)。

    C++实现

    #include 
     
    using namespace std;
     
    void Qsort(int arr[], int low, int high){
        if (high <= low) return;
        int i = low;
        int j = high;
        int key = arr[low];
        while (true)
        {
            /*从左向右找比key大的值*/
            while (arr[i] <= key)
            {
                i++;
                if (i == high){
                    break;
                }
            }
            /*从右向左找比key小的值*/
            while (arr[j] >= key)
            {
                j--;
                if (j == low){
                    break;
                }
            }
            if (i >= j) break;
            /*交换i,j对应的值*/
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        /*中枢值与j对应值交换*/
        arr[low] = arr[j];
        arr[j] = key;
        Qsort(arr, low, j - 1);
        Qsort(arr, j + 1, high);
    }
     
    int main()
    {
        int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
     
        Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/
     
        for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
            {
            cout << a[i] << " ";
        }
         
        return 0;
    }/*参考数据结构p274(清华大学出版社,严蔚敏)*/
    
    • 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
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    选择排序

    堆排序

    归并排序

  • 相关阅读:
    你们还不知道这几个实用的思维导图app吗?
    快来直播带你了解中国互联网大厂布局元宇宙现状如何?
    C++类的自动类型转换和强制类型转换
    数商云供应链系统深耕采购、物流多业务场景,打造家居建材企业智慧供应链体系
    Dubbo之注册与发现
    从零开始:如何通过美颜SDK构建自己的直播美颜工具
    flutter 混合开发 module 依赖
    2023全新云渲染测评!效果图渲染哪个平台性价比更高?
    SQL 撤销索引、表以及数据库||SQL CREATE DATABASE 语句||SQL CREATE TABLE 语句
    leetcode经典面试150题---6.旋转数组
  • 原文地址:https://blog.csdn.net/thisiszdy/article/details/133312820