parent
079c4a64d0
commit
4876b1e7d1
@ -0,0 +1,66 @@
|
|||||||
|
//堆排序
|
||||||
|
#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
|
||||||
|
//原理:堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数
|
Loading…
Reference in new issue