堆排序
2010-11-17 17:09
176 查看
#include <iostream> using namespace std; int heap_size; int length; //左孩子 int Left(int i) { return 2*i+1; } //右孩子 int Right(int i) { if(2*(i+1) <= length -1) { return 2*(i+1); } else { return -1; } } //交换两个值 void swap(int &a, int &b) { int c = a; a = b; b = c; } void Max_Heapify(int *A,int i) { int l = Left(i); int r = Right(i); int largest = i; if(l <= heap_size && A[l] > A[i]) { largest = l; } if(r != -1 && r <= heap_size && A[r]>A[largest]) { largest = r; } if(largest != i) { swap(A[i],A[largest]); Max_Heapify(A,largest); } } //建堆 void Build_Max_Heap(int *A) { for(int i=length/2; i >= 0; i--) { Max_Heapify(A,i); } } //堆排序 void Heap_Sort(int *A) { Build_Max_Heap(A); for(int i = length-1;i >=0; i--) { swap(A[0],A[i]); heap_size --; Max_Heapify(A,0); } } void printArray(int *A) { for(int i = 0; i < length; ++i) { cout << A[i] <<" "; } } int main() { int array[]={16,14,10,8,7,9,3,2,4,1}; length = sizeof(array)/sizeof(int); heap_size = length-1; Heap_Sort(array); printArray(array); cout <<endl; return 0; }