堆排序
1. 堆排序是构造一颗完全二叉树
2. 堆有最大堆与最小堆两种
3. 保持堆性质操作
当i的Left(i) 和 Right(i)都是最大堆,这时i可能小于其子女,调用保持堆性质操作,让A[i]下降使得以i为根的子树保持最大堆
4. 建堆操作
一个数组作为输入,先构建一个完全二叉树。这棵树一般不会满足最大堆性质。从i/2的节点位置开始,向前(i/2, i/2-1, i/2-2……)调用保持最大堆性质操作。最后将得到一个最大堆。
5. 堆排序操作
最大堆构建完成后。因为数组中最大元素在根A[1],则通过把它与A[n]互换来达到。现在,从堆中“去掉”节点n(输出n节点的值),然后对A[1…n-1]构建最大堆。因为原来根的子女仍是最大堆,所以可能新的根元素违反了最大堆性质,则只用对新的根元素调用一次保持堆性质操作,就能得到新的最大堆。
然后再次重复刚才的操作,即可实现堆排序。
合并排序
合并排序由MERGE-SORT和MERGE两个子程序组成。
MERGE-SORT(A,p,r)
If p < r
The q <- [ (p+r)/2 ]取下整数
MERGE-SORT(A, p, q)
MERGE-SORT(A,q+1,r)
MERGE(A,p,q,r)
合并排序由底向上进行排序。MERGE函数需要开辟新的存储空间来保存两个待合并的有序数组。
合并排序是由底向上是因为其先递归调用MERGE-SORT,然后在不可在分解的时候(或则人为不让再分解时)调用MERGE子程序。
合并排序可以将MERGE子程序替换掉,在将待排序空间划分到一个较小规模时,可以利用插入排序等其他排序方法。
快速排序
快速排序也由两个部分组成,QUICKSORT和PARTITION。
QUICKSORT(A,p,r)
If p<r
Then q <- PARTITION(A,p,r)
QUICKSORT(A,p,q-1)
QUICKSORT(A,q+1,r)
快速排序的关键是PARTITION,它将数组进行就地重新排列,以一个数为划分,左边的数组保存比它小的数,右边的数组保存比它大的数。然后递归对左右数组再次调用QUICKSORT。
快速排序是由上之下的排序算法,先进行顶层的排序,然后再递归调用左右部分进行排序。
快速排序的PARTITION子程序不可替换成其它子程序,因为它必须实现将数组划分为左右两个部分的逻辑。