二叉堆

刚才练习了一下手写堆, 以后忘记扫一眼。

支持插入元素,寻找最大,最小值的数据结构称为优先队列, 堆是优先队列的一种实现

 

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 // 建立一个最小堆,即从堆顶往下从小到大排
 5 int heap[260];
 6 int n;
 7 // 往下调整结点编号为i的点
 8 void siftdown(int i)
 9 {
10     int t, flag=0;
11     while(i*2<=n && flag==0)
12     {
13         if(heap[i]<heap[i*2])
14             t=i;
15         else
16             t=i*2;
17         if(i*2+1<=n && heap[t]>heap[i*2+1])
18             t=i*2+1;
19         if(t!=i)
20         {
21             swap(heap[t], heap[i]);
22             i=t;
23         }
24         else
25             flag=1;
26     }
27 }
28 // 向上调整编号为i的点,插入点时用
29 void siftup(int i)
30 {
31     int flag=0;
32     if(i==1)
33         return;
34     while(i!=1 && flag==0)
35     {
36         if(heap[i]<heap[i/2])
37             swap(heap[i], heap[i/2]);
38         else
39             flag=1;
40         i/=2;
41     }
42 }
43 void creat()
44 {
45 // 最后一个非叶结点编号为N/2
46     for(int i=n/2; i>=1; i--)
47         siftdown(i);
48 }
49 int main()
50 {
51     scanf("%d", &n);
52     for(int i=1; i<=n; i++)
53         scanf("%d", &heap[i]);
54 
55 // 创造一个含n个点的最小堆
56     creat();
57 
58 // 插入m个点并排序
59     int m;
60     scanf("%d", &m);
61     for(int i=1; i<=m; i++)
62     {
63         scanf("%d", &heap[++n]);
64         siftup(n);
65     }
66 
67 // 输出
68     while(n)
69     {
70         printf("%d ", heap[1]);
71         heap[1]=heap[n];
72         siftdown(1);
73         n--;
74     }
75 }

 

posted @ 2018-08-12 10:22  paranoid。  阅读(157)  评论(0编辑  收藏  举报