1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace ConsolePractice
8 {
9 public class Node
10 {
11 public int data;
12 public Node(int key)
13 {
14 data = key;
15 }
16 }
17
18 class Heap
19 {
20 Node[] heapArray = null;
21 private int maxSize = 0;
22 private int currSize = 0;
23 public Heap(int maxSize)
24 {
25 this.maxSize = maxSize;
26 heapArray = new Node[maxSize];
27 }
28
29 public bool InsertAt(int pos, Node nd)
30 {
31 heapArray[pos] = nd;
32 return true;
33 }
34
35 public void ShowArray()
36 {
37 for (int i = 0; i < maxSize; i++)
38 {
39 if (heapArray[i] != null)
40 Console.Write(heapArray[i].data + " ");
41 }
42 Console.WriteLine();
43 }
44
45 public void ShiftUp(int index)
46 {
47 int parent = (index - 1) / 2;
48 Node bottom = heapArray[index];
49 while ((index > 0) && (heapArray[parent].data < bottom.data))
50 {
51 heapArray[index] = heapArray[parent];
52 index = parent;
53 parent = (parent - 1) / 2;
54 }
55 heapArray[index] = bottom;
56 }
57
58 public bool Insert(int key)
59 {
60 if (currSize == maxSize)
61 return false;
62 heapArray[currSize] = new Node(key);
63 currSize++;
64 return true;
65 }
66
67 public Node Remove()
68 {
69 Node root = heapArray[0];
70 currSize--;
71 heapArray[0] = heapArray[currSize];
72 ShiftDown(0);
73 return root;
74 }
75
76 public void ShiftDown(int index)
77 {
78 int largerChild;
79 Node top = heapArray[index];
80 while (index < (int)(currSize / 2))
81 {
82 int leftChild = 2 * index + 1;
83 int rightChild = leftChild + 1;
84 if ((rightChild < currSize) && heapArray[leftChild].data < heapArray[rightChild].data)
85 largerChild = rightChild;
86 else
87 largerChild = leftChild;
88 if (top.data >= heapArray[largerChild].data)
89 break;
90 heapArray[index] = heapArray[largerChild];
91 index = largerChild;
92 }
93 heapArray[index] = top;
94 }
95 }
96
97 class C_shape
98 {
99 static void Main()
100 {
101 const int SIZE = 9;
102 Heap aHeap = new Heap(SIZE);
103 Random RandomClass = new Random();
104 for (int i = 0; i < SIZE; i++)
105 {
106 int rn = RandomClass.Next(1, 100);
107 aHeap.Insert(rn);
108 }
109
110 Console.WriteLine("Random:");
111 aHeap.ShowArray();
112
113 Console.WriteLine("Heap:");
114 for (int i = (int)SIZE / 2 - 1; i >= 0; i--)
115 {
116 aHeap.ShiftDown(i);
117 }
118 aHeap.ShowArray();
119
120 Console.WriteLine("Sorted:");
121 for (int i = SIZE - 1; i >= 0; i--)
122 {
123 Node bigNode = aHeap.Remove();
124 aHeap.InsertAt(i, bigNode);
125 }
126 aHeap.ShowArray();
127 Console.ReadKey();
128 }
129 }
130 }