1. 程式人生 > >面試題9:數組堆化、堆的插入、堆的刪除、堆排序

面試題9:數組堆化、堆的插入、堆的刪除、堆排序

art 面試 rewind 刪除 test from minimum 面試題 排序

參考:白話經典算法系列之七 堆與堆排序

 1 #include <iostream>
 2 #include <climits>
 3 #include <vector>
 4 using namespace std;
 5 
 6 namespace heap {
 7 
 8 //insert an element to a heap
 9 void insertToHeap(vector<int>& h, int x) {
10     h.push_back(x);
11     int n = h.size();
12 
13     int
i = n - 1; 14 int p = (i - 1) / 2; //parent 15 int temp = x; 16 while (p >= 0 && i != 0) { 17 if (h[p] <= temp) { 18 break; 19 } 20 h[i] = h[p]; 21 i = p; 22 p = (i - 1) / 2; 23 } 24 h[i] = temp; 25 } 26 27 void minHeapFixdown(vector<int
>& h, int i, int n) { 28 int tmp = h[i]; 29 int j = 2 * i + 1; 30 while (j < n) { 31 if (j + 1 < n && h[j + 1] < h[j]) { 32 j++; 33 } 34 if (h[j] >= tmp) { 35 break; 36 } 37 h[i] = h[j]; 38 i = j;
39 j = 2 * i + 1; 40 } 41 h[i] = tmp; 42 } 43 44 //delete an element from a heap 45 void deleteFromHeap(vector<int>& h) { 46 if (h.empty()) 47 return; 48 if (h.size() == 1) { 49 h.clear(); 50 return; 51 } 52 int n = h.size(); 53 h[0] = h[n - 1]; 54 h.erase(h.end() - 1); 55 minHeapFixdown(h, 0, n); 56 } 57 58 //make an array Minimum heap 59 void heapArray(vector<int>& h) { 60 int n = h.size(); 61 for (int i = n / 2 - 1; i >= 0; i--) { 62 minHeapFixdown(h, i, n); 63 } 64 } 65 66 void heapSort(vector<int>& h) { 67 int n = h.size(); 68 vector<int> tmp = h; 69 for (int i = 0; i < n; i++) { 70 h[i] = tmp[0]; 71 deleteFromHeap(tmp); 72 } 73 } 74 75 void printHeap(vector<int>& testVec) { 76 for (size_t i = 0; i < testVec.size(); i++) { 77 std::cout << testVec[i] << ","; 78 } 79 std::cout << std::endl; 80 } 81 } 82 ; 83 84 int main() { 85 vector<int> testVec = { 0, 3, 9, 1, 3, 5 }; 86 heap::heapArray(testVec); 87 heap::printHeap(testVec); 88 89 heap::deleteFromHeap(testVec); 90 heap::printHeap(testVec); 91 92 heap::insertToHeap(testVec, 4); 93 heap::printHeap(testVec); 94 95 heap::heapSort(testVec); 96 heap::printHeap(testVec); 97 98 return 0; 99 }

面試題9:數組堆化、堆的插入、堆的刪除、堆排序