1 #include <iostream>
2 #include <stdlib.h>
3 using namespace std;
4
5
6 const int MAXSIZE = 1000;
7
8 //堆结构体
9 class Heap {
10 private:
11 int array[MAXSIZE]; //堆数组
12 int size; //实际堆节点数
13 void init(); //初始化堆
14 void shiftUp(int i); //向上调整堆
15 void shiftDown(int i, int end);//向下调整堆
16 public:
17 void Insert(int value); //插入节点
18 void Delete(int i); //删除节点
19 void Display(); //输出堆数组
20 void Sort(); //堆排序
21 Heap();
22 };
23
24 void Heap::shiftUp(int i) {
25 int p = (i - 1) >> 1, t;
26 while (i > 0 && array[i] > array[p]) {//将节点key与父节点的key比较,若大于父节点,则与父节点交换位置,依次向上至根节点
27 t = array[i];
28 array[i] = array[p];
29 array[p] = t;
30 i = p;
31 p = (i - 1) >> 1;
32 }
33 }
34
35 void Heap::shiftDown(int i, int end) {
36 int cl = i * 2 + 1, cr = cl + 1, t, tt = -1;
37 while (cl <= end) { //将结点与左右子节点较大的一个比较,若小于,则将其与该子节点交换位置,依次向下至叶子节点
38 tt = -1;
39 if (cr <= end) {
40 if (array[i] < array[cl] || array[i] < array[cr]) {
41 tt = ((array[cl] > array[cr])?cl:cr);
42 }
43 } else if (array[i] < array[cl]) {
44 tt = cl;
45 }
46 if (tt > 0) {
47 t = array[i];
48 array[i] = array[tt];
49 array[tt] = t;
50 i = tt;
51 cl = i * 2 + 1;
52 cr = cl + 1;
53 } else {
54 break;
55 }
56 }
57 }
58
59 void Heap::Insert(int value) {
60 if (size < MAXSIZE) { //将节点插入至堆数组的最后,在向上进行调整堆
61 array[size] = value;
62 shiftUp(size++);
63 }
64 }
65
66 void Heap::Delete(int i) { //将堆数组最后一个节点移至要删除节点的位置,再向下调整堆
67 if (i < size && i >= 0) {
68 array[i] = array[size--];
69 shiftDown(i, size);
70 }
71 }
72
73 void Heap::Sort() { //将根结点与堆数组最后一个节点交换,并将堆数组节点数-1, 重新向下调整堆
74 int i = 1, t;
75 for (; i < size; ++i) {
76 t = array[0];
77 array[0] = array[size - i];
78 array[size - i] = t;
79 shiftDown(0, size - i - 1);
80 }
81 }
82 void Heap::Display() {
83 int j = 0;
84 while (j < size) {
85 cout << array[j++] << '\t';
86 }
87 }
88
89 void Heap::init() {
90 int randSize = rand() % 100, i = 0;
91 size = 0;
92 while (size < randSize) {
93 int num = rand() % 100;
94 Insert(num);
95 }
96 }
97
98 Heap::Heap() {
99 init();
100 }
101
102 int main(int args, char **argv) {
103 Heap heap;
104 heap.Display();
105 cout << "\nafter sort:" << endl;
106 heap.Sort();
107 heap.Display();
108 }