• 快速排序


    快速排序类似于冒泡排序,冒泡排序是在一次排序中找出最大或者最小的数,然后将它冒出,快速排序是依次排序找出基准数的位置(或者说确定所有数的性质,大于基准数或者小于基准数),一般取数组第一个元素为基准数

    过程是先确定一个基准数,然后经过一次排序,将所有大于基准的数放到基准数右边,所有小于基准数的都放大基准数左边。原数组就以基准数为标准分成了左右两个子集,对这两个子集继续做快速排序,直到所有子集都只剩下一个元素。

    快速排序的平均时间复杂度时O(nlogn),最坏情况下的时间复杂度时O(n^2)

    具体方法有挖坑法和指针交换法。

    挖坑法就是将要移位的元素移到前一个挖的坑,然后它移位前的位置变成了下一个坑,数组的第一个元素作为基准数,也是第一个坑,然后基准数放到最后一个坑里面。

    最后一个坑的判断条件:收尾下标为i,j,i后移,j前移,当i==j时,当前的i就是最后一个坑

    代码

    #include<iostream>
    using namespace std;
    
    int AdjArray(int* Array,int L,int R);
    void QuickSort(int* Array, int L, int R);
    
    int main(void)
    {
        // Init array & Input Array
        int ArrayLen;
        cin >> ArrayLen;
        int* Array = new int[ArrayLen];
        for (int i = 0; i < ArrayLen; ++i)
            cin >> Array[i];
    
        QuickSort(Array, 0, ArrayLen - 1);
    
        for (int i = 0; i < ArrayLen; ++i)
            cout << Array[i] << " ";
        cout << endl;
    
        delete[] Array;
        system("pause");
        return 0;
    }
    
    
    // 挖坑法
    int AdjArray(int* Array, int L, int R)
    {
        int i = L;
        int j = R;
        int Hole = Array[L];// 第一个坑,注意是从传入的第一个坐标开始,不是从0开始
    
        while (i < j)
        {
            // 从后往前,顺序很重要
            while (i<j&&Array[j]>Hole)
                --j;
            if (i < j)
            {
                Array[i] = Array[j];
                ++i;
            }
    
            // 从前往后
            while (i<j&&Array[i]<Hole)
                ++i;
            if (i < j)
            {
                Array[j] = Array[i];
                --j;
            }
        }
        Array[i] = Hole;
        /*for (int t = 0; t <=R; ++t)
            cout << Array[t] << " ";
        cout << endl;*/
        return i;
    }
    
    
    // 递归调用
    void QuickSort(int* Array, int L, int R)
    {
        if (L < R)
        {
            int Loc=AdjArray(Array, L, R);
            QuickSort(Array, L, Loc - 1);
            QuickSort(Array, Loc + 1, R);
        }
    }

    拓展:数组中的第K大元素

    比较基准数下标和K下标来决定走哪个递归

    #include<iostream>
    
    using namespace std;
    
    int SingleSort(int* Array, int L, int R);
    void QuickSort(int* Array, int L, int R,int MaxTh);
    int ArrLen;
    int main(void)
    {
        //int ArrayLen;
        cin >> ArrLen;
        int* Array = new int[ArrLen];
        for (int i = 0; i < ArrLen; ++i)
            cin >> Array[i];
    
        int MaxTh;
        cin >> MaxTh;
    
        QuickSort(Array, 0, ArrLen - 1,MaxTh);
    
        cout << endl;
        system("pause");
        return 0;
    }
    
    int SingleSort(int* Array, int L, int R)
    {
        int i = L;
        int j = R;
        int Hole = Array[i];
        while (i < j)
        {
            while (i<j&&Array[j]>Hole)
            {
                --j;
            }
            if (i < j)
            {
                Array[i] = Array[j];
                ++i;
            }
    
            while (i < j&&Array[i] < Hole)
            {
                ++i;
            }
            if (i < j)
            {
                Array[j] = Array[i];
                --j;
            }
        }
    
        Array[i] = Hole;
        return i;
    }
    
    void QuickSort(int* Array, int L, int R,int MaxTh)
    {
        if (L < R)
        {
            int Loc = SingleSort(Array, L, R);
            if (Loc > ArrLen - MaxTh)
            {
                QuickSort(Array, L, Loc - 1, MaxTh);
            }
            if (Loc < ArrLen - MaxTh)
            {
                QuickSort(Array, Loc + 1, R, MaxTh);
            }
            if (Loc == ArrLen - MaxTh)
                cout << Array[Loc];
        }
    }
  • 相关阅读:
    B树、B-树、B+树、B*树
    CentOS 7 源码编译安装PostgreSQL 9.5
    phpstorm里面无法配置deployment?
    Php7安装pdo_pgsql,pgsql扩展
    [xDebug] PhpStorm Xdebug远程调试环境搭建
    [xDebug]Xdebug和Sublime调试PHP代码
    [xDebug] 服务器端的配置参数
    [xDebug] php下的Debug的调试
    【转】漫画:什么是协程?
    【转】一个由正则表达式引发的血案----贪婪模式的回溯
  • 原文地址:https://www.cnblogs.com/wangtianning1223/p/13768832.html
Copyright © 2020-2023  润新知