You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.4 KiB
66 lines
1.4 KiB
//堆排序
|
|
#include <stdio.h>
|
|
#define N 1000
|
|
#define INF 999999999
|
|
int h[N];
|
|
void heapAdjust(int n,int par)
|
|
{
|
|
int tmp,pos,lc,rc;
|
|
while (par <= n/2) {
|
|
tmp = h[par];
|
|
lc = par<<1;
|
|
rc = lc+1;
|
|
pos = par;
|
|
if (h[par] < h[lc]) {
|
|
h[par] = h[lc];
|
|
pos = lc;
|
|
}
|
|
if (rc <= n && h[par] < h[rc]) {
|
|
h[par] = h[rc];
|
|
pos = rc;
|
|
}
|
|
if (pos == par)
|
|
break;
|
|
else
|
|
h[pos] = tmp;
|
|
par = pos;
|
|
}
|
|
}
|
|
void createHeap(int n)
|
|
{
|
|
int i;
|
|
|
|
for (i = n/2; i != 0; i--) {
|
|
heapAdjust(n, i);
|
|
}
|
|
}
|
|
void heapSort(int n)
|
|
{
|
|
int ntimes = n;
|
|
|
|
while (ntimes--) {
|
|
printf("%d\n", h[1]);
|
|
h[1] = h[n];
|
|
h[n--] = 0;
|
|
heapAdjust(n, 1);
|
|
}
|
|
}
|
|
int main(void)
|
|
{
|
|
int n, i;
|
|
|
|
scanf("%d", &n);
|
|
h[0] = INF;
|
|
for (i = 1; i != n+1; i++) {
|
|
scanf("%d", &h[i]);
|
|
}
|
|
createHeap(n);
|
|
heapSort(n);
|
|
return 0;
|
|
}
|
|
//参考测试数据
|
|
6
|
|
342 31 52 626 12 124
|
|
10
|
|
43 525 14 21 52 3 52 45 319 15155
|
|
//原理:堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数 |