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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

堆的简单实现

發布時間:2023/12/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆的简单实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于堆不做過多介紹

堆就是兒子的值一定不小于父親的值并且樹的節點都是按照從上到下,從左到右緊湊排列的樹。

(本文為二叉堆)

具體實現并不需要指針二叉樹,用數組儲存并且利用公式找到父子即可。

父:(i-1)/2

子:i*2+1,i*2+2

插入:首先把新數字放到堆的末尾,也就是右下角,然后查看父的數值,需要交換就交換,重復上述操作直到不需交換

刪除:把堆的第一個節點賦值為最后一個節點的值,然后刪除最后一個節點,不斷向下交換。

(兩個兒子:嚴格來說要選擇數值較小的那一個)

時間復雜度:和深度成正比,所以n個節點是O(logN)

int heap[MAX_N],sz=0; //定義數組和記錄個數的變量

插入代碼:

void push(int x) {//節點編號int i=sz++;while(i>0){int p=(i-1)/2;//父if(heap[p]<=x)break;//直到大小順序正確跳出循環heap[i]=heap[p];//把父節點放下來i=p;}heap[i]=x;//最后把自己放上去}

彈出:

int pop() {int ret=heap[0];//保存好值,最后返回int x=heap[--sz];while(i*2+1<sz){int a=i*2+1;//左孩子int b=i*2+2;//右孩子if(b<sz && heap[b]<heap[a])a=b;//找最小if(heap[a]>=x)break;//直到不需要交換就退出heap[i]=heap[a];//把兒子放上來i=a;}head[i]=x;//下沉到正確位置return ret;//返回 }

?

總結

以上是生活随笔為你收集整理的堆的简单实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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