#include<stdio.h> #include<stdlib.h> #define Left(x) ((x)<<1) #define Right(x) (((x)<<1) + 1) //Be careful '+' opeator > '<<' operator //假设数组从标号1开始存数值 //在Left(x)与Right(x)已经是大根堆的情况下 void heapify(int x, int *arr, int len) { int left = Left(x); int right = Right(x); int max = left; if(left > len) return ; if(right <= len && arr[right] > arr[left]) max = right; if(arr[max] > arr[x]) { int tmp = arr[max]; arr[max] = arr[x]; arr[x] = tmp; heapify(max, arr, len); } } void buildHeap(int *arr, int len) { for(int i = len/2; i>=1; i--) { heapify(i, arr, len); for(int j=1; j<=len; j++) printf("%d ", arr[j]); printf("/n"); } } void heapSort(int *arr, int len) { buildHeap(arr, len); for(int i=len; i>=1; i--) { int tmp = arr[i]; arr[i] = arr[1]; arr[1] = tmp; heapify(1, arr, --len); } } int arr[] = {5,6,4,2,1,3,9,8,7}; int main() { int *map; int len = sizeof(arr)/sizeof(int); map = new int[len + 1]; for(int i=0; i<len; i++) map[i+1] = arr[i]; heapSort(map, len); for(int i=1; i<=len; i++) arr[i-1] = map[i]; system("pause"); return 0; } 小心,在C中'<<'操作符优先级低于'+' 参见白话堆排序 http://blog.csdn.net/morewindows/article/details/6709644