堆(Heap)是計算機科學中一類特殊的數據結構的統稱。堆一般是一個能夠被看作一棵徹底二叉樹的數組對象。c++
它符合一種規律,若是每一個根結點的值比它全部的子節點的值要大,就叫大根堆,反之叫作小根堆數組
首先你得有一個數組,而後咱們一步步讓它符合堆的規則(如下爲大根堆)數據結構
首先找到最後一個非葉子結點(由於葉子結點沒有子節點),而後一步一步回到根結點,保證這個堆裏的每個根結點都小於它的子節點spa
1 for(int i=size/2-1;i>=0;--i) 2 make(a,i,size);
而後開始讓它們符合規律code
void make(int now, int size) { int left=2*now+1;//左兒子 int right=2*now+2;//右兒子 int max=now;//假設他是最大的 //把它與孩子節點做比較,若是孩子節點大於它, //爲了保持堆規律,咱們要讓如今這個節點最大 if(left<size&&a[left]>a[max]) max=left; if(right<size&&a[right]>a[max]) max=right; if(max!=now) { swap(a[max],a[now]); make(max,size);//繼續向下遞歸,由於交換後孩子節點就小了,可能不符合堆規律 } }
而後一個最大堆就建好了對象
如今有了一個大根堆了,可是要排序,怎麼排呢?首先,這個大根堆的頂部,必定是這些數中最大的,咱們只須要把這個最大的取出來,而後再來維護大根堆,再取出最大的.......blog
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[100005],n; 4 void make(int now,int size) 5 { 6 int left=2*now+1; 7 int right=2*now+2; 8 int max=now; 9 if(left<size&&a[left]>a[max]) 10 max=left; 11 if(right<size&&a[right]>a[max]) 12 max=right; 13 if(max!=now) 14 { 15 swap(a[max],a[now]); 16 make(max,size); 17 } 18 } 19 20 void heap_sort(int n) 21 { 22 for(int i=n/2-1;i>=0;--i) 23 make(i,n); 24 for(int i=n-1;i>=0;i--) 25 { 26 swap(a[0], a[i]); 27 cout<<a[i]<<" "; 28 make(0,i); 29 } 30 } 31 32 int main() 33 { 34 cin>>n; 35 for(int i=0;i<n;i++) 36 { 37 scanf("%d",&a[i]); 38 } 39 heap_sort(n); 40 return 0; 41 }
小根堆排序改一下符號便可排序