ACM_快速排序算法

来源:互联网 发布:诸神黄昏坐骑进阶数据 编辑:程序博客网 时间:2024/05/21 14:58
每次以数组第一个数为基数,从数组两端往中间找,小于基数的数放在数组的左边,大于它的数放在数组的右边,当i == j的时候,查找结束,将基数赋值到这个位置,这个数在数组中的位置就是这个,确定了。然后从这个数的左边和右边开始递归,直到所有的数都排完序。
时间复杂度:nlog2n(最好,平均)、n2(最坏)
#include<cstdio>#include<iostream>using namespace std;void sort(int ri[],int l,int r){    if (l < r)    {        int i = l , j = r , x = ri[l];//x = ri[l],不是 x = ri[1]        while (i < j) // i == j 的时候,这次查找就结束了        {            // while里面的循环都必须保证i < j            while (i < j && ri[j] >= x)            {                --j;            }            if (i < j)//如果没有这条语句直接赋值的话,倘若上面while结束循环的条件是i = j,那么接下来的赋值就会出错            {                ri[i++] = ri[j];            }            while (i < j && ri[i] < x)            {                ++i;            }            if (i < j)            {                ri[j--] = ri[i];            }        }        ri[i] = x; // 将基数赋值到这个位置        sort(ri,l,i-1); // 从i位置的左边开始递归,由于i位置的数已经确定,所以本次递归右边的数是从i-1开始的        sort(ri,i+1,r); // 同上    }    return ;}int main(){    int i,n,ri[100];    while (~scanf("%d",&n))    {        for (i = 0; i < n; ++i)            scanf("%d",&ri[i]);        sort(ri,0,n-1);        for (i = 0; i < n; ++i)            printf("%d ",ri[i]);        printf("\n");    }    return 0;}

0 0