void heapsort(int a[], int len) { int heap_size, j; build_max_heap(a, len); heap_size = len; for (j = len - 1; j > 0; j--) { swap(&a[0], &a[j]); heap_size--; max_heapify(a, 0, heap_size); } } void build_max_heap(int a[], int len) { int j; for (j = len/2 - 1; j >= 0; j--) { max_heapify(a, j, len); } } void max_heapify(int a[], int i, int heap_size) { int l, r, largest; l = 2 * i + 1; r = 2 * i + 2; largest = i; if (l < heap_size && a[largest] < a[l]){ largest = l; } if (r < heap_size && a[largest] < a[r]){ largest = r; } if (largest != i){ swap(&a[i], &a[largest]); max_heapify(a, largest, heap_size); } } void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; }
测试用例
#include <stdio.h> int main() { int a[] = {5, 1, 7, 12, 9, 6}; int i; heapsort(a, 6); for (i = 0; i < 6; i++) { printf("%d%s", a[i], (i==5)?"\n":" "); } return 0; }