编程练习13
1 //------------------------------------------------------------------ 2 //堆排序:关键是堆的构建和堆的调整,而堆的构建本质上也是堆的调整 3 //------------------------------------------------------------------ 4 #include <iostream> 5 using namespace std; 6 7 void swap(int* a,int* b) 8 { 9 if(*a!=*b) 10 { 11 *a=*a^*b; 12 *b=*a^*b; 13 *a=*a^*b; 14 } 15 } 16 //----------------------------------|||||||||||---------------------------------------------------- 17 //----------------------------------华丽的分割线--------------------------------------------------- 18 //----------------------------------|||||||||||---------------------------------------------------- 19 void heapadjust(int* arr,int num,int pos) //堆的一次调整过程:从pos位置开始调整 20 { 21 int i=pos,j=2*i+1; 22 if(j<=num) //左儿子节点非叶子节点 23 { 24 if(j==num) //这种情况是左儿子节点恰好是最后一个节点 25 { 26 if(arr[i]<arr[j]) 27 swap(&arr[i],&arr[j]); //到底了,那就直接交换,没必要再往下调整 28 } 29 else 30 { 31 if(arr[i]<arr[j] && arr[j]>arr[j+1]) //左儿子节点更大 32 { 33 swap(&arr[i],&arr[j]); 34 heapadjust(arr,num,j); //往下继续调整 35 } 36 else if(arr[i]<arr[j+1] && arr[j+1]>arr[j]) //右儿子节点更大 37 { 38 swap(&arr[i],&arr[j+1]); 39 heapadjust(arr,num,j+1); //往下继续调整 40 } 41 } 42 43 } 44 45 } 46 //----------------------------------|||||||||||---------------------------------------------------- 47 //----------------------------------华丽的分割线--------------------------------------------------- 48 //----------------------------------|||||||||||---------------------------------------------------- 49 void heapbuild(int* arr,int num) //构建堆,其实也是堆的调整过程 50 { 51 for(int i=(num-1)/2;i>=0;--i) //从非叶子节点开始调整 52 heapadjust(arr,num,i); 53 } 54 55 void heapsort(int* arr,int num) 56 { 57 int n=num; 58 heapbuild(arr,num); //先构建好一个最大堆 59 60 while(num) 61 { 62 swap(&arr[0],&arr[num]); //根节点出列 63 num--; 64 heapadjust(arr,num,0); //堆的调整过程:从根节点开始 65 } 66 } 67 void print(int* arr,int n) 68 { 69 for(int i=0;i<=n;++i) 70 cout<<arr[i]<<" "; 71 } 72 //----------------------------------|||||||||||---------------------------------------------------- 73 //----------------------------------华丽的分割线--------------------------------------------------- 74 //----------------------------------|||||||||||---------------------------------------------------- 75 int main() 76 { 77 int arr[]={3,6,0,7,22,19,8,9,0,3,18,3,19}; 78 int num=sizeof(arr)/sizeof(int); 79 80 if(num<=1) goto end; 81 heapsort(arr,num-1); 82 end: 83 print(arr,num-1); 84 cout<<endl; 85 86 return 0; 87 }
堆排序,近两个小时才完成,我 ,真崩溃!!
思想的高度决定事情的成败!
浙公网安备 33010602011771号