快速排序 Quicksort

快速排序的特点:

  • 分治的思想
  • 就地排序,不需要额外的内存
  • 实用性强

分支的步骤:

  1. Divide: 把一个数组分成两部分,使得数组的下班部分都比主元要小,上半部分都比主元要大。
  2. Conquer:递归地对两个子序列进行排序
  3. Combile:子序列合并

Partition的过程:

  

Partition(A,p, q)
    pivot = A[p];
    i = p;
    for(j = p+1; j <= q; j++){
        if(A[j]<=pivot){
             i++;
             exchange(A[i], A[j]);
        }
    }
    exchange(A[p], A[i]);
  return i;
  • 划分运行时间:time=θ(n);

 Quicksort的过程:

Quicksort(A, p, q)
    if p<q
        r = partition(A, p, q);
        Quicksort(A, p, r-1);
        Quicksort(A, r+1, q);

最坏情况下的快速排序:

  • 如果输入的序列是已经排好序的或者刚好逆序
  • 每次Partition的一边都没有元素
  • T(n)=T(n-1) +θ(n) =θ(n2)
  • 此时快速排序的时间复杂度也插入排序相同

最好情况下的快速排序(我们不应当期望输入序列是最好的情况):

  • 每次划分刚好在数组的中间
  • T(n) = 2T(n/2) + θ(n) = θ(nlgn)

随机化快速排序算法:

  • 随机化选择主元
  • 对输入序列的分布不做任何假设

T(n)是对n个元素进行快速排序所用时间的随机变量

For k=0,1……n-1

xk=1 产生了k:n-k-1的划分

xk=0 otherwise

则E[Xk] = 1/n

随机化快速排序算法时间变量的期望:

 

 

 

posted @ 2013-11-18 20:27  memcpy  阅读(163)  评论(0编辑  收藏  举报