随机快速排序算是快速排序的一种优化,但本质上只是使得快速排序的最坏情况不取决于输入数据的分布而取决于所取的伪随机数的情况。使得出现最坏情况的概率变得更随机一些,使得出题人不能用一个简单的逆序数组什么的就让快速排序退化为n^2的算法。
代码如下(对应POJ上的题目):
#include <stdio.h>
#include <stdlib.h>
int D[100010],t;
void swap(int * a, int * b)
{
t = * a;
* a = * b;
* b = t;
}
void Sort(int *A, int l)
{
if (l <= 1)
return;
int p = A[rand() % l];
int i = 0, j = l - 1, k = 0;
while(k <= j)
if (A[k] < p)
swap(A + i++, A + k++);
else if (A[k] > p)
swap(A + j--, A + k);
else
k++;
Sort(A, i);
Sort(A + j + 1, l - j - 1);
}
int main()
{
int N;
scanf("%d", &N);
for (int i = 0; i < N; i++)
scanf("%d", &D[i]);
Sort(D, N);
for (int i = 0; i < N; i++)
printf("%d\n", D[i]);
return 0;
}
并附上已经被玩坏了的352B的短代码...
#include<stdio.h>
#include<stdlib.h>
int t,D[100010],N,m;void s(int*a,int*b){t=*a;*a=*b;*b=t;}void S(int*A,int l){if(l<2)return;int p=A[rand()%l],i=0,j=l-1,k=0;while(k<=j)if(A[k]<p)s(A+i++,A+k++);else if(A[k]>p)s(A+j--,A+k);else k++;S(A,i);S(A+j+1,l-j-1);}main(){scanf("%d",&N);for(m=0;m<N;)scanf("%d",D+m++);S(D,N);for(m=0;m<N;)printf("%d\n",D[m++]);}