《算法导论》第6章 堆排序 个人笔记

第6章 堆排序

6.1 堆

最大堆:A[PARENT(i)]>=A[i]
最小堆:A[PARENT(i)]<=A[i]

6.2 维护堆的性质

void HeapAdjust(int H[],int s, int length)  
{  
    int tmp  = H[s];  
    int child = 2*s+1; //左孩子结点的位置。(i+1)为当前调整结点的右孩子结点的位置
    while (child < length) {  
        if(child+1 <length && H[child]<H[child+1]) { // 如果右孩子大于左孩子(找到比当前待调整结点大的孩子结点)  
            ++child ;  
        }  
        if(H[s]<H[child]) {  // 如果较大的子结点大于父结点  
            H[s] = H[child]; // 那么把较大的子结点往上移动,替换它的父结点  
            s = child;       // 重新设置s ,即待调整的下一个结点的位置  
            child = 2*s+1;  
        }  else {            // 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出  
             break;  
        }  
        H[s] = tmp;         // 当前待调整的结点放到比其大的孩子结点位置上
}  

6.3 建堆

void BuildingHeap(int H[], int length)  
{   
    //最后一个有孩子的节点的位置 i = (length -1) / 2  
    for (int i = (length -1) / 2 ; i >= 0; --i)  
        HeapAdjust(H,i,length);  
} 

6.4 堆排序

void HeapSort(int H[], int length)  
{  
    //初始堆  
    BuildingHeap(H, length);  
    //从最后一个元素开始对序列进行调整  
    for (int i = length - 1; i > 0; --i)  
    {  
        //交换堆顶元素H[0]和堆中最后一个元素  
        int temp = H[i]; H[i] = H[0]; H[0] = temp;  
        //每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整  
        HeapAdjust(H, 0, i);
     }  
} 

6.5 优先队列

  1. HeapExtractMax:去掉并返回S中的具有最大键字的元素
int HeapExtractMax(int H[], int length)  
{
    if (length < 1)
        return -1;
    int max = H[0];
    H[0] = H[length-1]
    HeapAdjust(H, 0, length - 1)
    return max;
}
  1. HeapIncreaseKey:将元素x的关键字值增加到key
void HeapIncreaseKey(int H[], int length, int i, int key)  
{
    if (key < H{i])
        return;
    H[i] = key
    while (i > 0 && H[(i-1)/2] < H[i]){
        H[i] = H[(i-1)/2];
        H[(i-1)/2] = key;
        i = (i-1)/2;
    }
}
  1. MaxHeapInsert:将新元素x插入到集合S中
int[] MaxHeapInsert(int H[], int length, int key){
    int newH[] = new int[length + 1];
    for (int i  = 0; i <= length; i++)
        newH[i] = H[i];
    newH[length] = -1;
    length++;
    HeapIncreaseKey(H, length, length - 1, key);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值