快速排序

快速排序

-利用分治策略

-在原地排序

-经过调整后很实用

#include<stdio.h>

void quicksort(int* A, int p, int r);
int partition(int* A, int p, int r);

int main()
{
    int A[10] = {11, 2, 3, 13, 5, 9, 10, 11, 19, 15};
    quicksort(A, 0, 10);
    for(int i = 0; i < 10; i++)
        printf("%d ", A[i]);
    return 0;
} 

void quicksort(int* A, int p, int r)
{
    int q;
    if(p < r){
        q = partition(A, p, r);
        quicksort(A, p, q - 1);
        quicksort(A, q + 1, r);
    }
}

int partition(int* A, int p, int r)
{
    int x = A[r];
    int i = p - 1;
    int temp;
    for(int j = p; j <= r - 1; j++){
        if(A[j] <= x){
            i++;
            temp = A[i];
            A[i] = A[j];
            A[j] = temp;
        }
    }
    temp = A[i + 1];
    A[i + 1] = A[r];
    A[r] = temp;
    return i + 1;
}

 

算法分析

最坏情况

1.数据已经排好序或者逆序

2.每个分划的一边都没有元素

此时递归式为:T(n) = T(0) + T(n-1) + θ(n)

          = T(n-1) + Θ(n) = Θ(n2)

最优情况

最好的情况分划为 n/2 : n/2

此时递归式为: T(n) = 2T(n/2) + Θ(n) = Θ(n lgn) 

 

假设划分过程总产生9:1的划分,

此时递归式为 T(n)  = T(1/10n) + T(9/10n) + Θ(n)

                               ≤ cnlog10/9n + Θ(n) = Θ(n lgn)

 

假设最坏情况和最好情况交替

此时递归式为:

L(n) = 2U(n/2) + Θ(n)

U(n) = L(n-1) + Θ(n)

用代换法:L(n) = 2(L(n/2 - 1) + Θ(n/2)) + Θ(n)

       = 2L(n/2 - 1) + Θ(n)

       = Θ(n lgn) 

 

随机化快速排序

  • 其运行时间不依赖于输入序列的顺序
  • 无需对输入序列的分布做任何假设
  • 没有一种特定的输入会引起最差情况
  • 最差的情况由随机数生成器决定

 

做法是随机的输入或者随机选择主元

算法分析

令T(n) 为运行时间的随机变量

 

posted @ 2018-03-28 19:28  乐高先生  阅读(131)  评论(0编辑  收藏  举报