排序算法——堆排序

主要设计操作:

(1)max_heap():调整堆使其保持堆性质

(2)build_heap():堆的建立

(3)sort_heap():堆排序

1 #include <iostream> 2 using namespace std; 3 #define N 10 4 //大顶堆的保持: 5 //a:数组 6 //i:节点i出可能不满足大顶堆的性质,需要调整 7 //n:此时堆中元素的个数,n<=N 8 void max_heap(int *a,int i,int n) 9 { 10 int l = 2*i+1; 11 int r = 2*i+2; 12 int large = 0; 13 14 while(l<n || r < n)//循环终止条件 15 { 16 large = i; 17 if(l<n && a[large] < a[l]) 18 large = l; 19 if(r<n && a[large]<a[r]) 20 large = r; 21 if(large == i)//当节点i本来就满足大顶堆性质时,不需要调整 22 break; 23 int tmp = a[large]; 24 a[large] = a[i]; 25 a[i] = tmp; 26 i = large; 27 l = 2*i+1; 28 r = 2*i+2; 29 } 30 } 31 void build_heap(int *a) 32 { 33 int i = 0; 34 for(i=N/2-1;i>=0;i--)//从第一个非叶子节(N/2-1)点开始,通过自下向上调整每一个非叶子节点 35 { 36 max_heap(a,i,N); 37 } 38 } 39 void sort_heap(int *a) 40 { 41 build_heap(a);//首先建立一个大顶堆 42 int i = 0; 43 i=N-1; 44 while(i>0)//将大顶堆的根节点和最后一个叶子节点交换,然后重新调整堆,使满足大顶堆性质 45 { 46 int tmp = a[i]; 47 a[i] = a[0]; 48 a[0] = tmp; 49 max_heap(a,0,i); 50 i--; 51 } 52 } 53 int main() 54 { 55 int a[10]={3,5,0,0,0,9,12,1,2,7}; 56 int i =0; 57 sort_heap(a); 58 for(i = 0;i<N;i++) 59 cout << a[i] << " " ; 60 cout <<endl; 61 }

你可能感兴趣的:(算法,ini,Build,iostream)