• 算法导论9.1-1


    寻找第二小的元素:

    如果用堆排序的方法,我们建立一个堆后只需要O(n),比较根节点的左儿子和右儿子的大小就可以得到第二小的节点了。而且BuildHeap的代价只有O(n)。

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 #define Left(i)    i*2+1
     6 #define Right(i) i*2+2
     7 
     8 int size = 10;
     9 
    10 void Exchange(int &a, int &b)
    11 {
    12     int c = a;
    13     a = b;
    14     b = c;
    15 }
    16 
    17 void MaxHeap(int a[], int i)
    18 {
    19     int l = Left(i);
    20     int r = Right(i);
    21     int largest = i;
    22     if (l < size&&a[l] < a[largest])
    23         largest = l;
    24     if (r < size&&a[r] < a[largest])
    25         largest = r;
    26     if (largest != i)
    27     {
    28         Exchange(a[largest], a[i]);
    29         MaxHeap(a, largest);
    30     }
    31 }
    32 
    33 void BuildHeap(int a[])
    34 {
    35     for (int i = (size - 1) / 2; i >= 0; i--)
    36     {
    37         MaxHeap(a, i);
    38     }
    39 }
    40 
    41 int main()
    42 {
    43     int a[] = { 16, 4, 10, 14, 14, 9, 3, 2, 8, 1 };
    44     BuildHeap(a);
    45     for (int i = 0; i < 10; i++)
    46         cout << a[i] << "    ";
    47     if (a[Left(0)] < a[Right(0)])
    48         cout << endl << a[Left(0)] << endl;
    49     else
    50         cout << endl<< a[Right(0)] << endl;
    51 }

    但是这种做法并不符合题目的要求,体现不出题目中对n+ceil(lgn)-2的阐述,所以我在实现一下题目的思想。

  • 相关阅读:
    angularjs中的指令
    git笔记
    webpack.config.js
    webpack开发react常用插件和依赖
    angularjs中的分页指令
    angularjs中的排序和过滤
    react学习
    gulp学习
    Javascript 判断变量类型的陷阱 与 正确的处理方式
    Fn.bind.apply() 解决 new 操作符不能用与 apply 或 call 同时使用
  • 原文地址:https://www.cnblogs.com/chaiwentao/p/4308954.html
Copyright © 2020-2023  润新知