转自算法导论中文版7.3节
英文解释转自http://cs.stackexchange.com/questions/7582/what-is-the-advantage-of-randomized-quicksort
快速排序的随机化版本
快速排序的平均情况运行时间与最佳情况的运行时间很接近,而不是非常接近于最坏情况运行时间。
快速排序的平均情况是指假定输入数据的所有排列是等可能的。
可以在算法中加入随机化的成分,以便对于所有输入,它均能获得较好的平均情况性能。
很多人都认为,快速排序的随机化版本是对足够大的输入的理想选择。
RANDOMIZED-PARTITION(A, p, r)
1 i <- RANDOM(p,r)
2 exchange A[i]<-> A[r]
3 return PATITION(A, p, r)
RANDOMIZED-QUICKSORT(A, p, r)
1 if p < r
2 then q <- RANDOMIZED-PARTITION(A, p, r)
3 RANDOMIZED-QUICKSORT(A, p, q-1)
4 RANDOMIZED-QUICKSORT(A, q+1, r)
#include <stdio.h>
#include <stdlib.h>
void swp(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int randomized(int p, int q)
{
int size = q - p +1;
return p + rand()%size;
}
int partation(int a[], int p, int r)
{
int x = a[r];
int i = p -1;
int j;
for (j = p; j < r; j ++) {
if (a[j] <= x) {
i++;
swp(&a[j], &a[i]);
}
}
swp(&a[i+1], &a[r]);
return i+1;
}
int random_partation(int a[], int p, int r)
{
int i;
i = randomized(p, r);
swp(&a[i], &a[r]);
return partation(a, p, r);
}
void random_quicksort(int a[], int p, int r)
{
if (p < r) {
int q = random_partation(a, p, r);
random_quicksort(a, p, q-1);
random_quicksort(a, q+1, r);
}
}
int main(void)
{
int i;
int a[] = {
0, 3, 7, 1, 9, 3, 5, 4, 0, 9, 10
};
random_quicksort(a, 1, 10);
for (i = 1; i < 11; i++) {
printf("%d ", a[i]);
}
return 0;
}