HeapSort C++
作者:互联网
from Wiki
概述
若以升序排序说明,把数组转换成最大堆(Max-Heap Heap),这是一种满足最大堆性质(Max-Heap Property)的二叉树:对于除了根之外的每个节点i, A[parent(i)] ≥ A[i]。
重复从最大堆取出数值最大的结点(把根结点和最后一个结点交换,把交换后的最后一个结点移出堆),并让残余的堆维持最大堆性质。
堆节点的访问
通常堆是通过一维数组来实现的。在数组起始位置为0的情形中:
- 父节点i的左子节点在位置;
- 父节点i的右子节点在位置;
- 子节点i的父节点在位置;
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