堆排序 合并排序 快速排序 简单比较

来源:互联网 发布:mastercam9.1编程全集 编辑:程序博客网 时间:2024/06/05 10:26

堆排序

1.      堆排序是构造一颗完全二叉树

2.      堆有最大堆与最小堆两种

3.      保持堆性质操作

iLeft(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-SORTMERGE两个子程序组成。

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子程序替换掉,在将待排序空间划分到一个较小规模时,可以利用插入排序等其他排序方法。

 

快速排序

快速排序也由两个部分组成,QUICKSORTPARTITION

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子程序不可替换成其它子程序,因为它必须实现将数组划分为左右两个部分的逻辑。