编程语言
首页 > 编程语言> > HeapSort C++

HeapSort C++

作者:互联网

from Wiki

概述

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

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

堆节点的访问

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

Max_Heapify

 

Build max-heap

算法导论 P89

 

 

 

 

#include"HEAPSORT".h

 1 #pragma once
 2 #include<vector>
 3 
 4 //近似完全二叉树:节点i的父节点、左孩子、右孩子
 5 //默认向偶数(向下)取整 ----《深入理解计算机系统》
 6 //以0为起始数组
 7 int parent(const int& i)
 8 {
 9     return (i - 1) / 2;
10 }
11 int left(const int& i)
12 {
13     return 2 * i + 1;
14 }
15 int right(const int& i)
16 {
17     return 2 * i + 2;
18 }
19 
20 //化为最大堆:父节点>左孩子>右孩子   i为父节点
21 void Max_Heapify(std::vector<int>& A, const int& i,const int &heap_size)
22 {
23     int l = left(i);
24     int r = right(i);
25     int largest;
26     //寻找该节点结构(父、左、右)中最大值
27     if (l <= heap_size && A[i] < A[l]) 
28         largest = l;
29     else
30         largest = i;
31     if (r <= heap_size && A[largest] < A[r])
32         largest = r;
33     //使最大值为父节点
34     if (largest != i)
35     {
36         std::swap(A[i], A[largest]);
37         //使被交换的结点结构也是最大堆
38         Max_Heapify(A, largest,heap_size);
39     }
40 }
41 
42 //建堆:从下到上
43 void Build_Max_Heap(std::vector<int>& A,const int &heap_size)
44 {
45     // A[n/2]+1+...+n都是含有孩子的父节点
46     for (int i = (A.size() / 2)-1; i >= 0;--i)
47         Max_Heapify(A, i,heap_size);
48 }
49 
50 void HeapSort(std::vector<int>& A)
51 {
52     int heap_size = A.size()-1;
53     Build_Max_Heap(A,heap_size);
54     //倒数第二个最大堆化:这时就剩下根节点A[0]和该节点i 再次进行最大堆后顺序已定
55     for (int i = A.size()-1; i != 0;--i) 
56     {
57         std::swap(A[0], A[i]);//最大堆化后A[i]为最大值 :排在末尾 
58         --heap_size;
59         Max_Heapify(A, 0,heap_size);
60     }
61 }

main.cpp

 1 #include<iostream>
 2 
 3 using namespace std;
 4 #include<iterator> //ostream_iterator
 5 void print(vector<int>& v)
 6 {
 7     ostream_iterator<int> out_iter(cout, " ");
 8     copy(v.begin(), v.end(), out_iter);
 9 }
10 #include"HEAPSORT.h"
11 void HeapSort()
12 {
13     vector<int> v = {4,1,3,2,16,9,10,14,8,7};
14     print(v);
15     cout << endl;
16     HeapSort(v);
17     cout << "heap_soted: " << endl;
18     print(v);
19 }
20 int main()
21 {
22     HeapSort();
23 }

 

标签:const,int,Max,HeapSort,C++,heap,节点,size
来源: https://www.cnblogs.com/Z-s-c11/p/13832703.html