好久不用排序,堆排序快忘记了。所有的排序里面,堆排序可能是最有趣的。其它的比较和交换的排序,都是两个元素的比较和交换,它是三个。
首先是建个堆。就是完全2-叉树,在根到叶子结点,每个路径上都排序的情况。然后把头结点拿掉,尾巴拿上来, 规模缩小1。直到 规模小到1时排序完成了。
#include <stdio.h>
void print(int arr[], int n)
{
int i;
for(i=0; i<n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void sort(int arr[], int n)
{
int i, j, p, c, d, t;
enum {RA_R0, RA_R1, RA_R2 } ra;
if (!(n >1)) return;
ra = RA_R1;
for(i= n/2-1; i>=0; --i) {
j = i;
goto heap;
ra_r1: ;
}
ra = RA_R2;
while( --n >0 ) {
j = 0;
p = n;
goto swap;
heap:
p = j;
c = j+j+1;
d = c+1;
if ( c>= n) goto next;
j =c;
if ( d<n && arr[d] < arr[c] ) {
j = d;
}
if (arr[p] >arr[j] ) {
swap:
t = arr[j];
arr[j] = arr[p];
arr[p] = t;
goto heap;
}
next:
if (ra==RA_R1) goto ra_r1;
}
}
int main()
{
int arr[10];
int i;
printf("input 10 numbers:\n");
for(i=0;i<10; i++) scanf("%d", &arr[i]);
print(arr, 10);
sort(arr, 10);
print(arr, 10);
return 0;
}