1 void HeapAdjust(int a[],int s,int m) 2 { 3 int temp = a[s]; 4 5 for(int j=2*s;j<=m;j=j*2) 6 { 7 if(j<m && a[j]<a[j+1]) 8 ++j; 9 if(temp>=a[j]) //如果只写大于而不写等于会出现问题, 10 break; 11 else 12 { 13 a[s]=a[j]; 14 s=j; 15 } 16 } 17 18 a[s] = temp; 19 } 20 21 void HeapSort(int a[],int n) 22 { 23 for(int i=n/2-1;i>=0;--i) 24 HeapAdjust(a,i,n-1); 25 for(int i=n-1;i>0;--i) 26 { 27 swap(a[0],a[i]); //将大顶堆的根与最后一个元素相交换 28 29 HeapAdjust(a,0,i-1); 30 } 31 }
HeapAdjust(int a[],int s,int m)实现的功能是一次调整,假设数组中除了a[s]外都满足大顶堆的定义。
HeapSort(int a[],int n)中有两步,第一步是根据原来的数组建立一个符合定义的大顶堆。 然后把大顶堆的第一个元素与最后一个元素想交换,那么势必使得原来的
大顶堆不在符合定义(即从a[0]到a[i-1])已不是大顶堆,要调整。
时间: 2024-11-29 09:13:49