1. 程式人生 > 實用技巧 >小(大)頂堆排序

小(大)頂堆排序

#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(); }