#include<iostream> #include<stdio.h> using namespace std; /** 创建一个堆:大的数是根 */ void swap(int arr[],int i,int j) { int temp= arr[i]; arr[i]=arr[j]; arr[j]=temp; } void heapify(int tree[],int n,int i) { //检查输入的这个节点的位置对不对 //如果大的数在底层就让它上去 if(i>=n) { return; } int c1 = 2*i+1; int c2 = 2*i+2; //计算两个儿子的编号 int max = i; if(c1<n && tree[c1]>tree[max]) { max=c1; } if(c2<n && tree[c2]>tree[max]) { max=c2; } //查找儿子们和父亲中那个大 if(max!=i) { swap(tree,max,i); heapify(tree,n,max); } //如果儿子大于父亲就交换 //然后继续往下一层判断 } void build_heap(int tree[],int n) { //对每一节点都检查一遍就成功建立成了一个堆 int last_node = n-1; int parent=(last_node-1)/2; for(int i=parent;i>=0;--i) { heapify(tree,n,i); } } /* 堆排序:从大到小 */ void heap_sort(int tree[],int n) { build_heap(tree,n); for(int i=n-1;i>=0;--i) { swap(tree,i,0);//交换根节点和最后一个叶子 heapify(tree,i,0);//砍断那个最后的叶子 } } int main() { int tree[]={4,10,2,5,1,3}; int n=6; //堆排序 heap_sort(tree,n); for(int i=0;i<n;++i) { cout<<tree[i]<<" "<<endl; } return 0; }
来自灯神的讲解,这里我加了一点自己的注释:https://www.bilibili.com/video/av47196993