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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构之选择排序:堆排序

發布時間:2025/3/15 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之选择排序:堆排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

選擇排序:堆排序

  • 思維導圖:
  • 堆的概念:
  • 堆的初始化:
  • 堆排序的算法思想:
  • 堆排序代碼實現:
  • 堆排序的插入:
  • 堆排序的刪除:
  • 堆排序的性能:

思維導圖:

堆的概念:

根>=左右孩子節點的順序存儲二叉樹
i的范圍為n/2取下界,即最后一個雙親節點
小根堆:
大根堆:

堆的初始化:

以大根堆為例:


代碼實現:

void BuildMaxHeap(int a[],int len){for(int i=len/2;i>0;i--) //從后往前調整所有非終端節點AdjustDown(a,i,len); }//將以k為根的子樹調整為大根堆 void AdjustDown(int a[],int k,int len){ //數組、當前調整節點、節點大小 a[0] = a[k]; //哨兵節點for(int i=2*k;i<=len;i*=2){ //每次循環的下一個節點是此節點的左孩子節點 if(i<len && a[i]<a[i+1]) //判斷i的合法性且左孩子節點的值小于右孩子,讓i指向右孩子節點i++;if(a[0]>=a[i]) //判斷右孩子和哨兵節點的大小,若哨兵節點大,說明雙親節點大于左右孩子節點,退出本次循環break;else{ //否則賦值并改變k的值繼續向下調整a[k] = a[i];k = i;}}a[k] = a[0]; //將哨兵節點賦值到最終調整到的節點 }

時間復雜度: O(n) 與樹的高度h有關

堆排序的算法思想:

1、建立一個大根堆
2、將堆頂元素待排序序列最后一個元素交換
3、將待排序序列再次調整為大根堆

堆排序代碼實現:

void HeapSort(int a[],int len){int temp;BuildMaxHeap(a,len);for(int i=len;i>1;i--){temp = a[i];a[i] = a[1];a[1] = temp;AdjustDown(a,1,i-1); //每輸出一個元素,i就要減1} }int main(){int i;int a[5] = {NULL,2,11,6,9};HeapSort(a,4);for(i=1;i<5;i++)printf("%d\t",a[i]); }

堆排序的插入:


代碼實現:

void AdjustUp(int a[],int k){a[0] = a[k];int i = k/2;while(i>0 && a[i] < a[0]){ //沒有調整到根節點且雙親節點小于孩子節點時a[k] = a[i];k = i;i = k/2; //將i賦值為雙親節點繼續調整}a[k] = a[0]; //將孩子節點的值賦值給最終調整的節點 }

堆排序的刪除:

被刪除的元素用堆底元素代替,然后讓該元素不斷“下墜”,直到無法下墜為止
1、代替

2、下墜

堆排序的性能:

時間復雜度: O(nlog2n)
時間復雜度: O(1)
不穩定


總結

以上是生活随笔為你收集整理的数据结构之选择排序:堆排序的全部內容,希望文章能夠幫你解決所遇到的問題。

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