1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
| #include <bits/stdc++.h> using namespace std; const int MaxData = 1024; using ElementType = int; struct HNode { ElementType *Data; int Size; int Capacity; };
using MinHeap = struct HNode *; MinHeap MinCreate(int MaxSize); MinHeap CreateMinHeap(int arr [], int len); void MinHeap_Insert(MinHeap H, ElementType item); ElementType DeleteMin(MinHeap H); void MinHeap_Adjust(MinHeap H); MinHeap HeapSort(MinHeap H); MinHeap HeapSort(MinHeap H, int n); bool IsFull(MinHeap H); bool IsEmpty(MinHeap H); int getSize(MinHeap H);
void Test() { int len = 12; int arr [] = {142, 543, 123, 65, 453, 879, 572, 434, 111, 242, 811, 102}; MinHeap H = CreateMinHeap(arr, len); H = HeapSort(H); for (int i = 1; i <= H->Capacity; ++i) { cout << H->Data[i] << " "; } cout << endl; }
int main() {
Test(); return 0; } MinHeap MinCreate(int MaxSize) { MinHeap H = new (struct HNode); H->Data = new ElementType[MaxSize+1]; H->Size = 0; H->Capacity = MaxSize; H->Data[0] = MaxData; return H; }
MinHeap CreateMinHeap(int arr[], int len) { MinHeap H = MinCreate(len); for (int i = 0; i <= len - 1; ++i) { H->Data[++H->Size] = arr[i]; } MinHeap_Adjust(H); return H; }
void MinHeap_Insert(MinHeap H, ElementType item) { int i; if (IsFull(H)) { cout << "堆已满" << endl; return; } i = ++H->Size; for ( ; i >= 2 && H->Data[i/2] > item; i /= 2) { H->Data[i] = H->Data[i/2]; } H->Data[i] = item; }
ElementType DeleteMin(MinHeap H) { int parent, child; ElementType MinItem, temp; if (IsEmpty(H)) { cout << "最小堆为空" << endl; return - 1; } MinItem = H->Data[1]; temp = H->Data[H->Size--]; for (parent = 1; parent * 2 <= H->Size; parent = child) { child = parent * 2; if ((child != H->Size) && (H->Data[child] > H->Data[child+1])) { child += 1; } if (temp <= H->Data[child]) { break; } else { H->Data[parent] = H->Data[child]; } } H->Data[parent] = temp;
return MinItem; }
void MinHeap_Adjust(MinHeap H) { for (int parent = H->Size / 2; parent >= 1; --parent) { ElementType temp = H->Data[parent]; int child = 2 * parent; while (child <= H->Size) { if ((child + 1) <= H->Size && H->Data[child + 1] <= H->Data[child]) { child += 1; } if (temp <= H->Data[child]) { H->Data[child / 2] = temp; break; } H->Data[child / 2] = H->Data[child]; H->Data[child] = temp; child = 2 * child; } } }
MinHeap HeapSort(MinHeap H) { for (int i = 1; i <= H->Capacity; ++i) { int item = DeleteMin(H); H->Data[H->Size + 1] = item; } return H; }
MinHeap HeapSort(MinHeap H, int n) { if (n == 0) { return H; } else { int item = DeleteMin(H); H->Data[H->Size + 1] = item; return HeapSort(H, H->Size - 1); } }
bool IsFull(MinHeap H) { return H->Size == H->Capacity; }
bool IsEmpty(MinHeap H) { return H->Size == 0; }
int getSize(MinHeap H) { return H->Size; }
|