基本思想:与归并排序一样,快速排序也采用了分治法。将原问题分解成几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。在快速排序中,因为子数组都是原址排序的,所以不需要合并操作。

----------
/*排序算法:快速排序
时    间:2018年1月14日
时间复杂度:最好情形O(nlgn),平均情形O(nlgn),最差情形O(n^2)
空间复杂度:O(lgn)
稳  定  性:不稳定
by Ingran*/
----------
#include<iostream>
#include<time.h>
#include<iomanip>
void Swap(int A[], int i, int j)
{
    int temp = A[i];
    A[i] = A[j];
    A[j] = temp;
}
int Partition(int A[], int p, int r)//对子数组进行原址重排
{
    int x = A[r]; //储存数组最后一个元素最为“主元”
    int i = p - 1;
    for (int j = p; j < r; j++)
    {
        if (A[j] <= x)
        {
            i = i + 1;
            Swap(A, i, j);//把小于主元的数值放在左边
        }
    }
    Swap(A, i + 1, r);//把r放在相对于(左边是比r小的,右边是比r大的)中间的位置
    return i + 1;//返回当前主元位置的下标
}
void Quick_Sort(int A[], int p, int r)//快速排序,参数为数组A,数组A的首元素下标和最后一个元素的下标
{
    int q = 0;
    if (p < r)
    {
        q = Partition(A, p, r);
        Quick_Sort(A, p, q - 1);
        Quick_Sort(A, q + 1, r);
    }
}
int main()
{
    int *p = nullptr;
    int n = 0;
    srand((unsigned)time(NULL));
    std::cout << "请输入随机数个数:" << std::endl;
    std::cin >> n;
    p = new int[n];
    std::cout << "排序前:" << std::endl;
    for (int i = 0; i < n; i++)
    {
        p[i] = rand() % 101;
        std::cout << std::setw(3) << p[i] << "  ";
        if (i % 10 == 9)
            std::cout << std::endl;
    }
    Quick_Sort(p, 0, n - 1);
    std::cout << std::endl << "排序后:" << std::endl;
    for (int i = 0; i < n; i++)
    {
        std::cout << std::setw(3) << p[i] << "  ";
        if (i % 10 == 9)
            std::cout << std::endl;
    }
    system("pause");
    return 0;
}