堆排序分析(大根堆为例,由小到大排序)
生活随笔
收集整理的這篇文章主要介紹了
堆排序分析(大根堆为例,由小到大排序)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
時間復雜度為O(nlogn),思路就是從最后一個非葉結點開始,依次往回遍歷每個結點,將以該結點為根的子樹建立成大根堆,直到遍歷到整棵完全二叉樹的根結點時為止,此時整棵樹為大根堆。
以當前結點為根的子樹建立大根堆:
//向下調整,將該結點的子樹變成大根堆 void AdjustDown(int A[],int k,int len){ //k為根結點編號,len為數組長度 int i,j;A[0]=A[k];for(j=2*k;j<=len;j*=2){if(j<len&&A[j]<A[j+1]) //右孩子較大j++;if(A[0]<A[j]){A[k]=A[j];k=j; }else break;}A[k]=A[0]; }堆排序算法:
//堆排序算法 void HeapSort(int A[],int len){int i,temp;for(i=len/2;i>=1;i--) //建立初始大根堆AdjustDown(A[],i,len); //從len/2到1,反復調整堆for(i=len;i>1;i--){temp=A[1];A[1]=A[i];A[i]=temp; //把最大的元素放到了最后面,最終排序結果為由小到大AdjustDown(A[],1,i-1); //把剩余i-1個元素整理成堆} }這樣排序的結果為由小到大!?
如果插入元素的話,直接插入到最后的位置,然后將插入的元素向上調整,直到整棵樹再次變成大根堆時為止!
向上調整的代碼:
//插入元素到最后位置,需要向上調整建立大根堆 void AdjustUp(int A[],int len){A[0]=A[len];int i=len/2,j=len;while(i>0&&A[i]<A[0]){A[j]=A[i]; //雙親結點下調j=i;i/=2; //繼續向上比較 }A[j]=A[0]; }?
總結
以上是生活随笔為你收集整理的堆排序分析(大根堆为例,由小到大排序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总线标准的发展
- 下一篇: 超详细!各种内部排序算法的比较