zoukankan      html  css  js  c++  java
  • 堆排序练习(证明)

    堆排序练习(证明)

    关于堆排序的具体介绍和C代码实现见该链接

    算导关于堆排序的练习主要是一些证明,可以帮助理解堆的特征。部分练习是图示过程,这些练习认真用笔过一次会很有收获。

    1.在高度为h的堆中,最多和最少的元素个数是多少?

    最多:底层全满;1 + 2^1 + 2^2 + ...... + 2^h,等比数列求和得2^(h+1) - 1

    最少:底层只有一个节点;1 + 2^1 + 2^2 + ...... + 2^(h-1) + 1,等比数列求和得2^h - 1 + 1 = 2^h

    2.证明:含n个元素的堆的高度为floor(lgn)

    假设n个元素的堆的高度为h。由上题得2^h <= n <= 2^(h+1) - 1,因此h <= lgn < h+1。

    根据floor 和 ceiling 函数的性质

    维基

    得h = floor(lgn)

    3.证明:在一个最大堆的某棵子树中,最大元素在该子树的根上。(看了答案才知道用反证法,居然想不到反证法,离散数学白看了。。。。。)

    假设这个命题为错误的,存在一棵子树的最大元素不在该子树的根,最大元素的下标为m。

    则下标为m的节点的值比其父节点的值大,但是最大堆的特性为某个节点的值最多和其父节点的值一样大,矛盾,因此假设为错误,命题正确。

    4.证明:当用数组表示存储了m个元素的堆时,叶节点的下标是floor(n/2)+1, floor(n/2)+2,...n

    刚开始打算通过公式证明最有一个叶节点的父节点为floor(n/2),最后没能成功(数学太渣)。。。

    根据二叉堆的性质:某节点下标为i(非根节点),其父节点的下标为floor(i/2),因此最后一个叶节点的父节点的下标为floor(n/2),所以从下标floor(n/2)+1开始到n都是叶节点。

    5.写出最小堆中维持最小堆性质的操作(本来要求写伪代码)

     View Code

    void min_heapify(int A[], int length, int i){
    int l = 2 * i;
    int r = 2 * i + 1;
    int smallest;

    if(l <= length && A[l] < A[i])
    smallest = l;
    else
    smallest = i;
    if(r <= length && A[r] < A[smallest])
    smallest = r;

    if(smallest != i){
    int temp = A[smallest];
    A[smallest] = A[i];
    A[i] = temp;
    min_heapify(A, length, smallest);
    }
    }

    6.将max_heapify()函数的递归调用改为迭代结构,使效率提高。

     View Code

    void max_heapify(int A[], int length, int i){
    int l, r;
    int largest, temp;
    while(i <= length){
    l = 2 * i;
    r = 2 * i + 1;

    if(l <= length && A[l] > A[i])
    largest = l;
    else
    largest = i;
    if(r <= length && A[r] > A[largest])
    largest = r;

    if(largest != i){
    temp = A[largest];
    A[largest] = A[i];
    A[i] = temp;
    i = largest;
    }
    else
    break;
    }
    }

     

     

     

     

     

    分类: 算法导论
    标签: 算法导论

  • 相关阅读:
    初拾Java(问题一:404错误,页面找不到)
    新年新气象--总结过去,展望未来
    接口测试[整理]
    [转]SVN-版本控制软件
    浅谈黑盒测试和白盒测试
    Bug管理工具的使用介绍(Bugger 2016)
    P2805/BZOJ1565 [NOI2009]植物大战僵尸
    近期学习目标
    P3643/BZOJ4584 [APIO2016]划艇
    P5344 【XR-1】逛森林
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3325419.html
Copyright © 2011-2022 走看看