Add 堆排序

master
p7pykrxiq 3 years ago
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…
Cancel
Save