随笔2019-4-3

算法课

快速排序

  • 分治算法
  • sorts “in place” (与归并不同)
  • 应用“fine tuning”之后非常实用

套用分而治之

  1. Divide: 根据主元将数组划分成为两部分,一部分皆比主元大,一部分皆比主元小
    2.Conquer:对划分的两个部分进行递归操作
    3.Combine: do nothing

快排:递归划分
归并:递归合并

伪代码

Partition(A, p, q) //A[p,q]
  X=A[p] //pivot A[p]
  i = p
  for j = p+1 to q
    do if A[j] x
    then i = i + 1
  exchange A[i] <->A[j]
//数组中比主元小的数都移到了index i的位置,[i+1, j-1]为key的位置
exchange A[p]<->A[i]
return i

Time cost:

Quicksort(A, p, q)
  if p < q
    r = Partition(A, p, a)
    Quicksort(A, p, r-1)
    Quicksort(A, r+1, q)

tips:快排提速方法为,在元素较少的递归部分用更快的算法处理或者使用尾递归优化方法

Init call Quicksort(A, 1, n)

分析

T(n)=worst case time
即数组有序或逆序,等价于划分的一边没有元素
此时$$T(n)=T(0)+T(n-1)+\Theta(n)=T(n-1)+\Theta(n)=\Theta(n^2)

若中间划分则

若1:9划分则
$$T(n)=T(\frac{n}{10})+T(\frac{9n}{10})+\Theta(n)

递归树方法分析上面的case查看ipad笔记

好情况与坏情况交替出现

使用代换法求解:

所以说幸运的

快排优化:随机化快排

  • 运行时间不依赖于输入顺序
  • 无需对输入做任何假设
  • 最坏情况由随机数产生器决定,主要的方法为随机选主元

你可能感兴趣的:(随笔2019-4-3)