自己模拟了一遍,了解了整个排序的过程。。。
#include <stdio.h>
#include <string.h>
int size, n;
void HEAPIFY ( int *a, int i ) { //找最大堆
int l, r, largest, tmp;
l = 2 * i; //表示的是节点,我就是这的错误找了好久
r = 2 * i + 1;
if ( l <= size && a[l] > a[i] )
largest = l;
else
largest = i;
if ( r <= size && a[r] > a[largest] )
largest = r;
if ( largest != i ) {
tmp = a[i];
a[i] = a[largest];
a[largest] = tmp;
HEAPIFY ( a, largest );
}
}
void BUILD ( int *a ) { //建堆
size = n;
for ( int i = n / 2; i >= 1; --i )
HEAPIFY ( a, i );
}
void HEAPSORT ( int * a ) { //堆排序
BUILD ( a );
int tmp;
for ( int i = n; i >= 2; --i ) {
tmp = a[1];
a[1] = a[i];
a[i] = tmp;
size = size - 1;
HEAPIFY( a, 1 );
}
}
int main ( ) {
int a[100]; //数组的大小值得注意
while ( scanf ( "%d", &n ) != EOF ) {
memset ( a, 0, sizeof ( a ) );
for ( int i = 1; i <= n; ++i )
scanf ( "%d", &a[i] );
HEAPSORT ( a );
for ( int i = 1; i <= n; ++i )
printf ( "%d ", a[i] );
printf ( "\n" );
}
}
分享到: