random quicksort

来源:互联网 发布:数据分析师报名条件 编辑:程序博客网 时间:2024/05/12 13:12

转自算法导论中文版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;}


0 0
原创粉丝点击