- upheap (insert)
- downheap (delete)
- heap_sort
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int MINF = (1 << 31);
const int MAX_SIZE = 1000;
class Heap{
private:
int node[MAX_SIZE];
int cnt;
public:
Heap(){
cnt = 0;
for (int i = 0; i < MAX_SIZE; i++)
node[i] = MINF;
}
bool insert_hp(int v){ //upheap
if (cnt >= 1000) return false;
cnt++;
node[cnt] = v;
int here = cnt;
int parent = cnt / 2;
while (parent > 0){
if (node[parent] >= node[here])
break;
else{
swap(node[parent], node[here]);
here = parent;
parent = here / 2;
}
}
return true;
}
int delete_hp(){//downheap
if (cnt == 0) return MINF;
else{
int re_val = node[1];
node[1] = node[cnt];
node[cnt] = MINF;
cnt--;
int here = 1;
while (1){
int max_idx;
if (node[here * 2] > node[here * 2 + 1])
max_idx = here * 2;
else
max_idx = here * 2 + 1;
if (node[here] >= node[max_idx])
break;
else{
swap(node[here], node[max_idx]);
here = max_idx;
}
}
return re_val;
}
}
bool sort_hp(){
if (cnt == 0) return false;
int temp = cnt;
int sort_res[MAX_SIZE];
for (int j = temp; j >= 0; j--){
sort_res[j] = delete_hp();;
}
cnt = temp;
for (int i = 1; i <= temp; i++){
printf("%d ", sort_res[i]);
}
puts("");
}
void print_hp(){
for (int i = 1; i <= cnt; i++){
printf("%d ", node[i]);
}
puts("");
}
};
int main(){
freopen("input.txt", "r", stdin);
Heap mh;
int n; scanf("%d", &n);
for (int i = 0; i < n; i++){
int v; scanf("%d", &v);
mh.insert_hp(v);
}
mh.print_hp();
mh.sort_hp();
}
#include<iostream>
#include<algorithm>
using namespace std;
const int MINF = (1 << 31);
const int MAX_SIZE = 1000;
class Heap{
private:
int node[MAX_SIZE];
int cnt;
public:
Heap(){
cnt = 0;
for (int i = 0; i < MAX_SIZE; i++)
node[i] = MINF;
}
bool insert_hp(int v){ //upheap
if (cnt >= 1000) return false;
cnt++;
node[cnt] = v;
int here = cnt;
int parent = cnt / 2;
while (parent > 0){
if (node[parent] >= node[here])
break;
else{
swap(node[parent], node[here]);
here = parent;
parent = here / 2;
}
}
return true;
}
int delete_hp(){//downheap
if (cnt == 0) return MINF;
else{
int re_val = node[1];
node[1] = node[cnt];
node[cnt] = MINF;
cnt--;
int here = 1;
while (1){
int max_idx;
if (node[here * 2] > node[here * 2 + 1])
max_idx = here * 2;
else
max_idx = here * 2 + 1;
if (node[here] >= node[max_idx])
break;
else{
swap(node[here], node[max_idx]);
here = max_idx;
}
}
return re_val;
}
}
bool sort_hp(){
if (cnt == 0) return false;
int temp = cnt;
int sort_res[MAX_SIZE];
for (int j = temp; j >= 0; j--){
sort_res[j] = delete_hp();;
}
cnt = temp;
for (int i = 1; i <= temp; i++){
printf("%d ", sort_res[i]);
}
puts("");
}
void print_hp(){
for (int i = 1; i <= cnt; i++){
printf("%d ", node[i]);
}
puts("");
}
};
int main(){
freopen("input.txt", "r", stdin);
Heap mh;
int n; scanf("%d", &n);
for (int i = 0; i < n; i++){
int v; scanf("%d", &v);
mh.insert_hp(v);
}
mh.print_hp();
mh.sort_hp();
}
댓글 없음:
댓글 쓰기