快速排序

/*
 * A[p...r] 被划分为两部分,A[p...q] 和 A[q+1...r],
 * A[p...q] 的每个元素都小于等于 A[q+1...r] 中的元素。
 * 对子数组递归调用划分方法,整个数组就有序了。
 * */
void quick_sort(int A[], int p, int r)
{
    int q;
    if (p<r)
        q = partition(A, p, r);
    quick_sort(A, p, q);
    quick_sort(A, q+1, r);
}
void exchange(int *a, int *b)
{
    int t = *a; *a = *b; *b = t;
}

int partition(int A[], int p, int r)
{
    int x = A[p];
    int i = p-1;
    int j = r+1;
    while (1) {
        do j--; while (A[j]<=x);
        do i++; while (A[i]>=x);
        if (i<j) 
            exchange(A+i, A+j);
        else
            return j;
    }
    return p;
}

/* 
 * 随机返回一个[l, h]之间的数。
 * */
int random(int l, int h)
{
    return l + rand()%(h-l+1);
}

int randomized_partition(int A[], int p, int r)
{
    int i = random(p, r);
    exchange(A+p, A+i);
    return partition(A, p, r);
}
原文地址:https://www.cnblogs.com/prajna/p/2937863.html