#include <stdio.h>
#include <stdlib.h>
void HeapAdjust(int a[], int i, int length) //这个函数用来形成大根堆
{
int child;
int temp;
for (; 2 * i + 1 < length; i = child)
{
child = 2 * i + 1;
if (child < length - 1 && a[child + 1] > a[child])
{
++child;
}
if (a[i] < a[child])
{
temp = a[i];
a[i] = a[child];
a[child] = temp;
}
else
{
break;
}
}
}
void HeapSort(int a[], int length)
{
int i;
for (i = length / 2 - 1; i >= 0; --i) //此for是对堆进行排序,循环完毕后第一次形成一个大根堆
{
HeapAdjust(a, i, length);
}
for (i = length - 1; i > 0; --i) // 这个for用来取根堆顶端最大值。i从末尾元素开始,直到正数第二个元素,第一个元素不用交换
{
//异或运算的操作,不用中间变量实现两数交换
a[i] = a[0] ^ a[i];
a[0] = a[0] ^ a[i];
a[i] = a[0] ^ a[i];
HeapAdjust(a, 0, i); //上一个for循环实现一个大根堆,最顶端元素a[0]最大,在进行这个for循环时,将最顶端的最大值与数组末尾进行交换后,最顶端不再是最大值,调用HeapAdjus函数再次调整成一个大根堆,再取顶端最大值存放
}
}
void main()
{
int i;
int num[] = { 45, 9, 78, 23, 65, 85, 0, 21, 32 };
printf("\n排序前:\n");
for (i = 0; i < sizeof(num) / sizeof(int); i++)
{
printf("%4d", num[i]);
}
HeapSort(num, sizeof(num) / sizeof(int));
printf("\n排序后:\n");
for (i = 0; i < sizeof(num) / sizeof(int); i++)
{
printf("%4d", num[i]);
}
printf("\n");
system("pause");
}
执行后,每个村上下有序,但彼此之间无序。
村比较完,比较镇
此时镇上下有序,但彼此无序
再继续 i–,此时i=0
第一次形成一个大根堆,第一次实现一个有序的“区”,执行完HeapSort函数中的第一个for循环。开始执行第二个for循环,即取数并存放
a[0]和a[i]交换,此时i=length-1
交换完后,最大值被存储在a[length-1],但除了它以外,上面又变成一个无序的“区”了,所以再次调用HeapAdjust函数,使其成为一个有序的“区”,使顶端再次出现最大值,再将这个最大值与length-2交换,循环操作,存一个数,调一次“区”。