快速排序-QuickSort

自己尝试着实现的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开始的。唉,当时也不知道怎么了。。。。看来时不时的活动一下还是很有帮助哒~~~^^

点赞