自己尝试着实现的QuickSort,并且每次的关键点不是数组的最后一个元素,而是用随机数得出随机的下标,然后把下标对应的元素当成关键点。还是那句 话,本人菜鸟,请多多指教~~~^^

//交换两个数
template<class T>
void Exchange(T &a,T &b)
{
    T tmp;
    tmp=a;
    a=b;
    b=tmp;
}

//分解并重排
template<class T>
int Partition(T A[],int p,int r)
{
    //随机获取划分点的下标,每次获取后,
    //与本数组的最后一个元素交换,
    //划分点用x标记
    int s;
    srand(time(0));
    s=p+rand()%(r-p+1);
    Exchange(A[r],A[s]);
    T x=A[r];
    int i=p-1;
    for(int j=p;j<r;j++)
    {
        if(A[j]<=x)
        {
            i++;
            Exchange(A[i],A[j]);
        }
    }
    Exchange(A[r],A[i+1]);
    return i+1;
}

//QuickSort
template<class T>
void  QuickSort(T A[],int p,int r)
{
    int q;
    if(p<r)
    {
        q=Partition(A,p,r);
        QuickSort(A,p,q-1);
        QuickSort(A,q+1,r);
    }
}

//测试
void main()
{
    int A[]={3,45,78,2,45,89,7,12,9,10};
    int len=sizeof(A)/sizeof(int);
    QuickSort(A,0,len-1);
    for(int i=0;i<len;i++)
        cout<<A[i]<<endl;
}
写这个的步骤是先按照数组的最后一个元素为关键点来写的,然后为了更接近于平均情况,采用了随机获取。然后就开始头大了==!一直排不对,出去走了两圈, 回来才发现获取随机数的时候,每次的范围都是从0开始的。唉,当时也不知道怎么了。。。。看来时不时的活动一下还是很有帮助哒~~~^^