zoukankan      html  css  js  c++  java
  • HeapSort C++

    from Wiki

    概述

    若以升序排序说明,把数组转换成最大堆(Max-Heap Heap),这是一种满足最大堆性质(Max-Heap Property)的二叉树:对于除了根之外的每个节点i, A[parent(i)] ≥ A[i]。

    重复从最大堆取出数值最大的结点(把根结点和最后一个结点交换,把交换后的最后一个结点移出堆),并让残余的维持最大堆性质。

    堆节点的访问

    通常堆是通过一维数组来实现的。在数组起始位置为0的情形中:

    • 父节点i的左子节点在位置{displaystyle (2i+1)};
    • 父节点i的右子节点在位置{displaystyle (2i+2)};
    • 子节点i的父节点在位置{displaystyle floor((i-1)/2)};

    Max_Heapify

    Build max-heap

    算法导论 P89

     

    #include"HEAPSORT".h

     1 #pragma once
     2 #include<vector>
     3 //全局静态变量
     4 //它与全局变量的区别在于如果程序包含多个文件的话,
     5 //它作用于定义它的文件里,不能作用到其它文件里,
     6 //即被static关键字修饰过的变量具有文件作用域。
     7 //这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
     8 static int heap_size;
     9 
    10 //近似完全二叉树:节点i的父节点、左孩子、右孩子
    11 //默认向偶数(向下)取整 ----《深入理解计算机系统》
    12 //以0起始数组
    13 int parent(const int& i)
    14 {
    15     return (i - 1) / 2;
    16 }
    17 int left(const int& i)
    18 {
    19     return 2 * i + 1;
    20 }
    21 int right(const int& i)
    22 {
    23     return 2 * i + 2;
    24 }
    25 //化为最大堆:父节点>左孩子>右孩子   i为父节点
    26 void Max_Heapify(std::vector<int>& A, const int& i)
    27 {
    28     int l = left(i);
    29     int r = right(i);
    30     int largest;
    31     //寻找该节点结构(父、左、右)中最大值
    32     if (l <= heap_size && A[i] < A[l])
    33         largest = l;
    34     else
    35         largest = i;
    36     if (r <= heap_size && A[largest] < A[r])
    37         largest = r;
    38     //使最大值为父节点
    39     if (largest != i)
    40     {
    41         std::swap(A[i], A[largest]);
    42         //使被交换的结点结构也是最大堆
    43         Max_Heapify(A, largest);
    44     }
    45 }
    46 
    47 //建堆:从下到上
    48 void Build_Max_Heap(std::vector<int>& A)
    49 {
    50     // A[n/2]+1+...+n都是含有孩子的父节点
    51     for (int i = (A.size()-1) / 2; i >= 0;--i)
    52         Max_Heapify(A, i);
    53 }
    54 
    55 void HeapSort(std::vector<int>& A)
    56 {
    57     heap_size = A.size() - 1;
    58     Build_Max_Heap(A);
    59     //倒数第二个最大堆化:这时就剩下根节点A[0]和该节点i 再次进行最大堆后顺序已定
    60     for (int i = A.size() - 1; i != 0;--i)
    61     {
    62         std::swap(A[0], A[i]);//最大堆化后A[i]为最大值 :排在末尾 
    63         --heap_size;
    64         Max_Heapify(A, 0);
    65     }
    66 }

    main.cpp

    #include<iostream>
    #include<iterator> //ostream_iterator
    #include"HEAPSORT.h"
    using namespace std;
    void print(vector<int>& v)
    {
        ostream_iterator<int> out_iter(cout, " ");
        copy(v.begin(), v.end(), out_iter);
    }
    void HeapSort()
    {
        vector<int> v = {4,1,3,2,16,9,10,14,8,7};
        print(v);
        cout << endl;
        HeapSort(v);
        cout << "heap_soted: " << endl;
        print(v);
    }
    int main()
    {
        HeapSort();
    }
  • 相关阅读:
    windows下jmeter安装配置
    golang读取json配置文件
    磁盘分区、扇区等概念理解
    linux 命令笔记
    jvm静态分派和动态分派
    java实例初始化顺序
    计算机网络
    文件对比工具Meld
    IaaS、PaaS、SaaS
    USB 驱动常见名词解释
  • 原文地址:https://www.cnblogs.com/Z-s-c11/p/13832703.html
Copyright © 2011-2022 走看看