#include <stdio.h> #include <stdlib.h> #define LEFT(i) (i<<1) + 1 #define RIGHT(i) (i<<1) + 2 int N = 10; int heapSize = 10; void buildMaxHeap(int *parr); void maxHeapify(int *parr,int index); void heapSort(int *parr); void exchange(int &a, int &b); void main() { int arr[] = {16,14,8,7,10,9,3,2,4,1}; heapSort(arr); for (int index = 0; index< N;index++) { printf("%d/t",arr[index]); } getchar(); } void exchange(int &a, int &b) { int temp; temp = a; a = b; b = temp; } //keep the heap feature status. void maxHeapify(int *parr,int index) { int l = LEFT(index); int r = RIGHT(index); int largest = 0; if (l < heapSize && parr[l] > parr[index]) { largest = l; }else largest = index; if (r < heapSize && parr[largest] < parr[r]) { largest = r; } if (largest != index) { exchange(parr[largest],parr[index]); maxHeapify(parr,largest); } else return ; } void buildMaxHeap(int *parr) { //here: non-leaf node is from 0 to N/2, //can be demonstrated using negativeapproach. for (int i = N/2;i >= 0;i--) { maxHeapify(parr,i); } } void heapSort(int *parr) { buildMaxHeap(parr); //get the max number and then heapify again from 0; for (int index = heapSize;index>=1;index--) { exchange(parr[0],parr[heapSize-1]); heapSize--; maxHeapify(parr,0); } } 其实需要说明的一点是:堆中叶子节点的下标是从N/2+1开始,这点只需反证法就很明了。 而且本程序的核心就是maxHeapify函数,该函数用来保持最大堆得性质,parent>son。