【經常使用數據結構——堆(是時候該入土了)】

簡介

  堆(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 }

小根堆排序改一下符號便可排序

相關文章
相關標籤/搜索