二叉堆
刚才练习了一下手写堆, 以后忘记扫一眼。
支持插入元素,寻找最大,最小值的数据结构称为优先队列, 堆是优先队列的一种实现
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 }