#include <stdio.h>
#include <stdlib.h>
struct heap;
typedef struct heap *priorityQueue;
struct heap
{
int capacity;
int top;
int *array;
};
void insert(int x, priorityQueue H);
void percolateDown(int p, priorityQueue H);
int main()
{
int num;
scanf("%d", &num);
int array[num];
for (int i = 0; i < num; i++)
{
scanf("%d", &array[i]);
getchar();
}
priorityQueue H1, H2;
H1 = malloc(sizeof(struct heap));
H1->array = malloc(sizeof(int) * (num + 1));
H1->top = 0;
H1->capacity = num;
H2 = malloc(sizeof(struct heap));
H2->array = malloc(sizeof(int) * (num + 1));
H2->top = 0;
H2->capacity = num;
for (int i = 0; i < num; i++)
{
insert(array[i], H1);
}
for (int i = 0; i < num; i++)
{
H2->array[++H2->top] = array[i];
}
for (int i = num / 2; i > 0; i--)
{
percolateDown(i, H2);
}
for (int i = 1; i < num; i++)
{
printf("%d,", H1->array[i]);
}
printf("%d\n", H1->array[num]);
for (int i = 1; i < num; i++)
{
printf("%d,", H2->array[i]);
}
printf("%d\n", H2->array[num]);
return 0;
}
void insert(int x, priorityQueue H)
{
int i;
for (i = ++H->top; x < H->array[i / 2]; i = i / 2)
{
H->array[i] = H->array[i / 2];
}
H->array[i] = x;
}
void percolateDown(int p, priorityQueue H)
{
int child;
int i;
int x = H->array[p];
for (i = p; 2 * i <= H->capacity; i = child)
{
child = 2 * i;
if (child != H->capacity && H->array[child + 1] < H->array[child])
{
child++;
}
if (x > H->array[child])
{
H->array[i] = H->array[child];
}
else
{
break;
}
}
H->array[i] = x;
}
Note:
percolateDown 函数最后一定要加break!
percolateDown 函数最后一定要加break!
percolateDown 函数最后一定要加break!
另外:一组超级好用的测试数据
15
150,80,40,30,10,70,110,100,20,90,60,50,120,140,130
key:
10,20,50,30,40,70,110,150,100,90,60,80,120,140,130
10,20,40,30,60,50,110,100,150,90,80,70,120,140,130