堆排序和快速排序

比较排序:插入排序、合并排序、快速排序和堆排序都是通过比较的方法进行排序,其中合并排序和堆排序的时间是nlgn;还有其他的排序方法,包括
基数排序法、桶排序法。
堆排序算法使用到堆数据结构,堆数据结构是一种数组对象,可以被视为一棵完全二叉树,数中每个节点与数组中存放该节点的值的那个元素对应,
每层都被填满,最后一层可能除外。表示堆的数组结构有两个属性,length[A]是数组中元素个数,heap-size[A]表示存放在A中的堆元素个数,有
如下性值 heap-size[A] <= length[A]; 数的根是A[1],给定某个节点的下标i,其parent的下标parent[i]=i>>2;它的左子节点left[i]=i<<2
右子节点right[i]=i<<2+1。二叉堆有两种类型,分别是最大堆和最小堆,在这两种堆中,节点内的数值都满足堆特性。在最大堆中,除了根节点
以外的所有节点,满足A[parent[i]]>=A[i],即某个子节点的至多和其父节点的值一样大;最小堆则刚好相反,A[parent[i]]<=A[i]。在堆排序中,
使用的是最大堆,最小堆经常在构造优先队列中使用。

下面介绍5的过程以及它们在堆排序和构造有先队列中是如何使用的。
MAX-HEAPIFY
    是对最大堆进行操作的重要的子程序,输入为一个数组A和下标i,当MAX-HEAPIFY过程被调用时,我们假定了left[i]和right[i]为根的两个二叉树都是最大堆。
    这时A[i]可能小于其子节点,所以违反了最大堆的性值。MAX-HEAPIFY让元素A[i]在最大堆中下降,使以i为根节点的子树是最大堆。

 MAX-HEAPIFY(A, i)
        left <-- LEFT[i]
        right <-- RIGHT[i]
        if left < heap-size[A] & A[left] > A[i]
            largetst = left;
        else 
            largetst = i;
            
        if right < heap-size[A] & A[right] > A[larget]
            largest = right 
            
        if larget != i 
            then exchange A[i] <--> A[largest]
            MAX-HEAPIFY(A, larget)
    ----------------------------------------------------
    BUILD-MAX_HEAP 
        heap-size[A] = length[A]
        for i = lengt[A] /2 downto 1 
            do MAX-HEAPIFY
    ----------------------------------------------------


HEAPSORT:堆排序算法:
    先将A[1,n]构造成一个最大堆
        BUILD-MAX_HEAP;
    因为数组中最大值存在根A[1],通过将它和A[n]进行交换达到最终正确位置

 for i = length[A] downto 2
            do exchange A[1], A[i]
            heap-size[A] = heap-size[A] - 1
            MAX-HEAPIFY(A, 1)


MAX-HEAP-INSERT, HEAP-EXTRACT-MAX, HEAP-INCREASE-KEY, HEAP-MAXIMUM

快速排序算法是基于分治模式建立的算法,类似于合并排序。以下是对一个典型子数组A[p,r]排序的分治过程的三个步骤:
    (1)分解;数组A[p,r]被划分为两个子数组A[p, q-1]和A[q+1,r],是的A[p, q-1]的值小于A[q], A[q+1,r]子数组的
    所有元素都小于A[q],下标q也在这个划分过程中进行计算
    (2)解决:通过调用递归的快速排序,对子数组A[p,q-1]和A[q+1,r]排序;
    (3)合并:因为两个子数组是就地排序,将它们的合并不需要操作,整个A[p,r]已排序
    

QUICK_SORT(A, p, r)
   if p


    快速排序算法的关键是PARTITION过程,它对子数组A[p, r]进行就地排序:
        

PARTITION(A, p, r) 
           x <- A[p] 
           i <- p-1
            for j <- p upto r-1
            do    
                if A[j] < x
                then i = i+1; exchange A[i], A[j]
            
            exchange A[i+1], A[r]
        return i+1


   

你可能感兴趣的:(算法)