针对相同元素值的快速排序

来源:互联网 发布:风暴大陆升阶数据 编辑:程序博客网 时间:2024/05/22 15:12

如果数组中的元素值都相同,随机化的快速排序的运行时间将为O(n2)
因此,可以考虑对PARTITION过程进行优化。使新的PARTITION排列数组A[p..r]的元素,返回值是两个数组的下标q和t,其中pqtr,且有:
1. A[q..t]中所有的元素都相同
2. A[p..q-1]中的每个元素都小于A[q]
3. A[t+1..r]中的每个元素都大于A[q]
算法C语言实现如下:

typedef struct pivot{    int q;          //head to q - 1 for elements less than pivot    int t;          //q to t for elements equal to pivot} pivot_t;pivot_t partition_for_reduplicate_elem(int *source, int head, int tail) {    int temp = source[tail];    int q = head - 1;    int t = head - 1;    for (int j = head; j < tail; ++j) {        if (source[j] == temp) {            t++;            swap(source + j, source + t);        } else if (source[j] < temp) {            q++;            swap(source + j, source + q);            t++;            if (t != q)                swap(source + j, source + t);        }    }    q++;    swap(source + tail, source + q);    t++;    if (t != q)        swap(source + tail, source + t);    pivot_t result = {q, t};    return result;}pivot_t randomized_partition_for_reduplicate_elem(int *source, int head, int tail) {    swap(source + rand() % (tail - head + 1) + head, source + tail);    return partition_for_reduplicate_elem(source, head, tail);}void quick_sort_for_reduplicate_elem(int *source, int head, int tail) {    if (head >= tail)        return;    pivot_t result = randomized_partition_for_reduplicate_elem(source, head, tail);    quick_sort_for_reduplicate_elem(source, head, result.q - 1);    quick_sort_for_reduplicate_elem(source, result.t + 1, tail);}

关于该种方法的复杂度分析,并不知道怎么算,原题见算法导论第三版思考题7-2,答案。

阅读全文
0 0
原创粉丝点击