标签:turn get clu nbsp 完整 lap mic for logs
(from wikipedia)
构建步骤:
给定一个列表array=[16,7,3,20,17,8],对其进行堆排序。
首先根据该数组元素构建一个完全二叉树,得到
20和16交换后导致16不满足堆的性质,因此需重新调整
这样就得到了初始堆。
第二步: 堆顶元素R[1]与最后一个元素R[n]交换,交换后堆长度减一
第三步: 重新调整堆。此时3位于堆顶不满堆的性质,则需调整继续调整(从顶点开始往下调整)
重复上面的步骤:
不管是初始大顶堆的从下往上调整,还是堆顶堆尾元素交换,每次调整都是从父节点、左孩子节点、右孩子节点三者中选择最大者跟父节点进行交换,交换之后都可能造成被交换的孩子节点不满足堆的性质,因此每次交换之后要重新对被交换的孩子节点进行调整。(出自http://www.cnblogs.com/0zcl by前程明亮)
现在
开始
代码:
int main(){ cin>>n; for( int i=1; i<=n; i++){ cin>>a[i]; } heap_sort(); for( int i=1; i<=n; i++){ printf("%d ",a[i]); } return 0; }
(主函数不多说
void heap_sort(){ for( int i=n; i>=1; i--){ update(i,n); } for( int i=n-1; i>=1; i--){ swap(a[i+1],a[1]); update(1,i); } }
首先就是建立大根堆:
for( int i=n; i>=1; i--)update(i,n);
关于这个update函数是这样的:
对输入的两个数组的地址 i 和 n
然后就是heap_sort的内涵:
for( int i=n-1; i>=1; i--){ swap(a[i+1],a[1]); update(1,i); }
大致就是这样。
完整代码如下:
#include <cstdio> #include <iostream> using namespace std; int n; int a[50005]; #define lson(x) (x*2) void update(int x, int m){ int t=lson(x); if(t>m)return ; if(t<m && a[t+1]>a[t])t++; if(a[t]>a[x])swap(a[x],a[t]); update(t,m); } void heap_sort(){ for( int i=n; i>=1; i--){ update(i,n); } for( int i=n-1; i>=1; i--){ swap(a[i+1],a[1]); update(1,i); } } int main(){ cin>>n; for( int i=1; i<=n; i++){ cin>>a[i]; } heap_sort(); for( int i=1; i<=n; i++){ printf("%d ",a[i]); } return 0; }
标签:turn get clu nbsp 完整 lap mic for logs
原文地址:https://www.cnblogs.com/gogoflower/p/10624791.html