快速排序算法(C)

       sort快排函数的基本版,效率n*logn,快排的完全版就是在递归之中夹杂对序列的预判断,最优的选择排序方法,快速排序算法只是其中之一。

       简单的说明一下快速排序的思想,对于一个数列,首先选择一个基数(x),进行第一次排序,把比x 小的放在x左边,大的放右边(默认从小到大)。

       例如 : 8 4 5 7 6 9 2 1 3 0,  选择基数8  那么第一次排序的结果是这样的: 0 4 5 7 6 3 2 1 8 9

       之后捏,分治一下,以基数为界,左边排一遍,右边排一遍,再用得到的基数为界再排,排到没数为止。

      

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

int integer[100000];

int qsort(int s,int e)
{
    int i=s,j=e;
    int x=integer[i]; //  基准数
    int s_or_b=1;  //  找小数还是找大数的标志
    while(i!=j)
    {
        if(s_or_b&1)   //  s_or_b 为奇数  往X左边放小或等于的数
        {
            if(x >= integer[j])
            {
                integer[i++]=integer[j];
                s_or_b++;
            }
            else j--;
        }
        else
        {
            if(x <= integer[i])
            {
                integer[j--]=integer[i];
                s_or_b++;
            }
            else i++;
        }
    }
    integer[i]=x;
    return i;
}
void qsort_f(int s,int e)
{
    if(e-s<=1) return;
    int pos=qsort(s,e);
    qsort_f(s,pos-1);
    qsort_f(pos+1,e);
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int t;
        cin>>t;
        for(int i=0;i<t;i++)
        {
            cin>>integer[i];
        }
        qsort_f(0,t-1);
        for(int j=0;j<t;j++)
        {
            cout<<integer[j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

/*
10
8 4 5 7 6 9 2 1 3 0
*/

 

      

  

你可能感兴趣的:(快速排序算法(C))