算法基础4:快速排序(随机化版本)

来源:互联网 发布:mui实例源码 编辑:程序博客网 时间:2024/05/30 04:39
#include <stdio.h>#include <stdlib.h>#define MAXLEN 100int readSeq(int a[]); // 读入一个整数序列,返回读入的整数的个数void showSeq(int a[], int n);void quickSort(int a[], int p, int r);int partition(int a[], int p, int r);void swap(int* a, int* b);int main(){    int n, nums[MAXLEN];    while ((n = readSeq(nums)) > 0) // 如果输入的序列长度大于零就执行排序,否则退出    {        showSeq(nums, n);        quickSort(nums, 0, n - 1);        showSeq(nums, n);    }    return 0;}void swap(int* a, int* b){    int tmp = *a;    *a = *b;    *b = tmp;}int partition(int a[], int p, int r) // 如果不理解此版本的划分函数,参考《算法导论》第95~96页{    srand(time(0));    swap(&a[r], &a[p+rand()%(r-p+1)]); // 随机选取一个pivot    int j, i = p - 1;    for (j = p; j < r; j++)        if (a[j] < a[r])            swap(&a[++i], &a[j]);    swap(&a[++i], &a[r]);    return i;}void quickSort(int a[], int p, int r){    if (p < r)    {        int q = partition(a, p, r);        quickSort(a, p, q - 1);        quickSort(a, q + 1, r);    }}int readSeq(int a[]){    int n, i = 0;    scanf("%d", &n);    while (i < n)        scanf("%d", &a[i++]);    return i; // 如果n=0,i也为0}void showSeq(int a[], int n){    int i = 0;    while (i < n)        printf("%d ", a[i++]);    putchar('\n');}
1 0
原创粉丝点击