日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

堆排序分析(大根堆为例,由小到大排序)

發布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆排序分析(大根堆为例,由小到大排序) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

時間復雜度為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]; }

?

總結

以上是生活随笔為你收集整理的堆排序分析(大根堆为例,由小到大排序)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。