堆排序的实现

代码+注释:

#include <stdio.h>
#define N 10000
int num[N], a[N];

void heap_adjust(int x, int y)
{
int i = x, tmp = num[x];
int j = i<<1; //j左移一位,即i*2
while(j <= y) //当未超过堆底时
{
if(j < y && num[j+1] < num[j]) j++; //如果右孩子比左孩子小,j++
if(tmp > num[j]) //升序
{
num[i]
= num[j];
i
= j;
j
= i<<1;
}
else break;
}
num[i]
= tmp; //将num[x]补到相应的位置
}

int main()
{
int i, n;
scanf(
"%d", &n);
for(i = 1; i <= n; i++)
scanf(
"%d", num+i);
for(i = n/2; i >= 0; i--) heap_adjust(i, n); //将原数组num[]做一次堆排序,构成一个小根堆
int m = n;
i
= 0;
while(n--)
{
a[
++i] = num[1]; //将当前堆顶元素存到其他数组里
num[1] = num[n+1]; //删掉堆顶元素
heap_adjust(1, n); //重新进行一次堆排序,找到最小元素,放在堆顶
}
for(i = 1; i <= m; i++)
printf(
"%d ", a[i]); //将排好序的序列输出
printf("\n");
return 0;

}
原文地址:https://www.cnblogs.com/vongang/p/2115420.html