zoukankan      html  css  js  c++  java
  • 《算法导论》(二)堆排序

    中间计算复杂度与递归式太晕了,看的不甚明白,现在自感功力不够,修为不够,以后回头再看。。

    终于弄明白了堆排序的方法。。调整堆有点麻烦,记得时刻保持堆的性质就好了。。

    1 #include <iostream>
    2  using namespace std;
    3 #define LENGTH 10
    4
    5 int heap_size=0,size=LENGTH;
    6
    7 void max_heapify(int array[],int i)
    8 {//下标的问题要注意
    9 int l=(i<<1)+1;
    10 int r=(i<<1)+2;
    11 int largest;
    12
    13 if(l<heap_size&&array[l]>array[i])
    14 {
    15 largest=l;
    16 }
    17 else
    18 {
    19 largest=i;
    20 }
    21
    22 if(r<heap_size&&array[r]>array[largest])
    23 {
    24 largest=r;
    25 }
    26
    27 if(largest!=i)
    28 {
    29 swap(array[i],array[largest]);
    30 max_heapify(array,largest);
    31 }
    32 }
    33
    34 void build_max_heap(int array[])
    35 {
    36 heap_size=size;
    37 for (int i=(size%2==0?size/2-1:size/2);i>=0;i--)
    38 {//当对某结点调用MAX_heapify时,该结点的两棵子树都已是最大堆
    39 //为什么不是从0开始??递归定义结构决定。
    40 max_heapify(array,i);
    41 }
    42 }
    43
    44 void heap_sort(int array[])
    45 {
    46 build_max_heap(array);
    47
    48 for (int i=LENGTH-1;i>=1;i--)
    49 {
    50 swap(array[0],array[i]);
    51 heap_size=heap_size-1;
    52 size--;
    53 max_heapify(array,0);//根结点下标为0
    54 }
    55 }
    56
    57 int main()
    58 {
    59 int array[]={4,1,3,2,16,9,10,14,8,7};
    60 heap_sort(array);
    61 for (int i=0;i<LENGTH;i++)
    62 {
    63 cout<<array[i]<<" ";
    64 }
    65 cout<<endl;
    66 }
  • 相关阅读:
    AD 文档信息设置和制作模板
    用AT命令调试调制解调器
    语音AT命令参考
    传真AT指令部分(参考)
    传真调制解调器
    knockout+weui+zepto
    20171028随手记
    20171027随记
    一些简单又坑人的无聊使用
    ReadWrite,日志,输入文本
  • 原文地址:https://www.cnblogs.com/njucslzh/p/1832235.html
Copyright © 2011-2022 走看看