小(大)頂堆排序
阿新 • • 發佈:2020-12-15
#include<iostream> #include<math.h> #include<cstring> using namespace std; class small_heap { int* heap; int size; int flag; public: small_heap(); void print(); void swiftdown(int); void swap(int, int); void sort(); }; small_heap::small_heap() {char* line = new char[2000]; cin.getline(line, 2000); size = 1; for (int i = 0; i < strlen(line); i++) { if (line[i] == ' ')size++; } flag = size; heap = new int[size + 1]; for (int i = 1; *line != '\0'; i++) { char data[6] = {}; int s = 0, v = 0;while (*line != ' ' && *line != '\0') { data[s] = *line; s++; line++; } for (int i = 0; i < s; i++)v = v * 10 + data[i] - '0'; if (*line == ' ')line++; heap[i] = v; } for (int i = size / 2; i >= 1; i--) { swiftdown(i); } }void small_heap::swiftdown(int k) { while (k * 2 <= flag) { if (k * 2 == flag) { if (heap[k] >heap[2 * k]) { swap(k, 2 * k); } break; } else { if (heap[k] > min(heap[2 * k], heap[2 * k + 1])) { if (heap[2 * k] < heap[2 * k + 1]) { swap(k, 2 * k); k = k * 2; } else { swap(k, 2 * k + 1); k = k * 2 + 1; } } else { break; } } } } void small_heap::swap(int m, int n) { int temp = heap[m]; heap[m] = heap[n]; heap[n] = temp; } void small_heap::print() { for (int i = 1; i <= size; i++)cout << heap[i]<<' '; cout << endl; } void small_heap::sort() { while (flag > 1) { swap(1, flag); flag--; swiftdown(1); } } int main() { small_heap h; h.print(); h.sort(); h.print(); }