小(大)顶堆排序

#include<iostream>
#include<math.h>
#include<cstring>
using namespace std;
class min_heap
{
int* heap;
int size;
int flag;
public:
min_heap();
void print();
void swiftdown(int);
void swap(int, int);
void sort();
};
min_heap::min_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 min_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 min_heap::swap(int m, int n)
{
int temp = heap[m];
heap[m] = heap[n];
heap[n] = temp;
}
void min_heap::print()
{
for (int i = 1; i <= size; i++)cout << heap[i]<<' ';
cout << endl;
}
void min_heap::sort()
{
while (flag > 1)
{
swap(1, flag); flag--;
swiftdown(1);
}
}
int main()
{
min_heap h;
h.print();
h.sort();
h.print();
}

posted @ 2020-12-15 20:28  Waiting-lwt  阅读(96)  评论(0)    收藏  举报