雙端堆c語言,數據結構——雙端堆(C語言)

定義

雙端堆:是一棵完全二叉樹,該完全二叉樹要么為空,要么同時滿足下列性質:

(1)?根節點不包含元素;

(2)?左子樹是一個最小堆;

(3)?右子樹是一個最大堆;

(4)?如果右子樹不空,令i是左子樹中任意一節點,j是i在右子樹中的對應節點。如果i在右子樹中的對應節點不存在,則令j為i父節點在右子樹中的對應節點。對于節點i和j,節點i的關鍵字小于等于j的關鍵字。

c90e3dc0ebcdef09929b0c7016ef0642.png

雙端堆的插入操作

步驟

(1)若插入的新元素是在最小堆,將新插入節點與其在最大堆中對應節點相比較,如果大于對應節點,則將兩個節點元素互換,對最大堆執行max_insert操作;否則,只需對最小堆執行min_insert操作。

(2)若插入的新元素是在最大堆,將新插入節點與其在最小堆中對應節點相比較,如果小于對應節點,則將兩個節點元素互換,對最小堆執行min_insert操作;否則,只需對最大堆執行max_insert操作。

雙端堆的刪除操作

以下以刪除最小元素為例,刪除最大元素相似。

刪除最小元素基本思想:

首先,將從最小堆的根節點刪除的元素轉換為從最小堆的葉子節點中刪除元素的操作。這種轉換是通過在沿根節點到葉子節點的路徑上選擇關鍵字值較小的節點逐步上移來完成的。其結果是把初始時位于最小堆根節點處的空位移到一個葉子節點p。然后,用初始時位于雙端堆最后位置的元素temp插入到該葉子節點p。插入操作類似雙端堆的插入操作,只是插入操作僅在最小堆中進行,且其中max_paretner(i)的返回值j有改變。

程序

函數聲明:

#ifndef HEAP_H_INCLUDED

#define HEAP_H_INCLUDED

#include

#include

#include

#include

#define MAX_SIZE 10

int heap[MAX_SIZE];

void deap_insert(int *heap,int *n,int item);//雙端堆插入操作

int delete_deap_min(int *heap,int *n);//刪除雙端堆的最小元素

bool max_heap(int n);//判斷節點是否在最大堆中

int min_partner(int n);

int max_partner(int n);

void min_insert(int *heap,int n,int item);

void max_insert(int *heap,int n,int item);

void modified_deap_insert(int *heap,int i,int temp,int n);

int modified_max_partner(int i,int n);

#endif // HEAP_H_INCLUDED

函數定義:

#include"Heap.h"

/*雙端堆的插入操作*/

void deap_insert(int *heap,int *n,int item)

{

int i;

(*n)++;

if((*n)==MAX_SIZE)//滿堆

{

printf("The heap is full.\n");

exit(1);

}

if(2==(*n))//原來為空堆

heap[2]=item;

else

{

bool flag;

flag=max_heap(*n);//插入的節點是否在最大堆

switch(flag)

{

case true://節點在最大堆

i=min_partner(*n);//插入節點在最小堆所對應的節點

if(item

{

heap[*n]=heap[i];//交換元素

min_insert(heap,i,item);//把數據item插入到最小堆中

}

else

max_insert(heap,*n,item);//否則插入到最大堆中

break;

case false:

i=max_partner(*n);//插入節點在最大堆中對應的節點

if(item>heap[i])//比較最大堆節點和插入元素的大小

{

heap[*n]=heap[i];//交換元素

max_insert(heap,i,item);//插入到最大堆中

}

else

min_insert(heap,*n,item);//否則插入到最小堆

break;

}

}

}

/*刪除雙端堆的最小元素操作*/

int delete_deap_min(int *heap,int *n)

{

int i,j;

int temp;

int item;

if(*n<2)

{

fprintf(stderr,"The heap is empty.\n");

exit(1);

}

item=heap[2];//要刪除的元素

temp=heap[(*n)--];//最后元素賦給temp;

for(i=2;2*i<=*n;)

{//將從最小堆根節點刪除元素的操作

//轉換為從最小堆的葉子節點中刪除元素的操作

j=2*i;//j為i的葉子節點

if(j+1<=*n)

{

if(heap[j]>heap[j+1])

j++;//找出葉子節點中最小的關鍵字值節點

}

heap[i]=heap[j];//將葉子節點上移

i=j;//其結果是把初始時位于根節點處的空位移動到葉子節點i;

}

modified_deap_insert(heap,i,temp,*n);//用初始時位于雙端堆最后位置的節點元素插入到葉節點i;

//該插入操作與deap_insert()的插入操作基本類似;只是插入操作僅在最小堆中;且其中max_partner(i)

//的返回值j改變;

return item;

}

/*判斷節點n是否在最大堆中*/

bool max_heap(int n)

{

double a = log(n)/log(2);

double j = n + pow(2, (int)a-1);

double b = log(j)/log(2);

if((int)a == (int)b)

return false;

else

return true;

}

/*返回最大堆節點n對應最小堆的結點*/

int min_partner(int n)

{

double k = log(n)/log(2);

double a = pow(2, (int)k-1);

return n - (int)a;

}

/*返回最小堆節點n對應最大堆的結點*/

int max_partner(int n)

{

double k = log(n)/log(2);

double a = pow(2, (int)k-1);

return (n + (int)a)/2;

}

/*最小堆的插入操作*/

void min_insert(int *heap,int n,int item)

{

int i,parent;

i=n++;

parent=i/2;

while(parent>=1)

{

if(heap[parent]>item)

{

heap[i]=heap[parent];

i=parent;

parent/=2;

}

else break;

}

heap[i]=item;

}

/*最大堆的插入操作*/

void max_insert(int *heap,int n,int item)

{

int i,parent;

i=n++;

parent=i/2;

while(parent>1)

{

if(heap[parent]

{

heap[i]=heap[parent];

i=parent;

parent/=2;

}

else break;

}

heap[i]=item;

}

/*調整雙端堆*/

void modified_deap_insert(int *heap,int i,int temp,int n)

{

int j;

int item=temp;

i++;

if(i==MAX_SIZE)//滿堆

{

printf("The heap is full.\n");

exit(1);

}

if(2==i)//原來為空堆

heap[2]=item;

else

{

bool flag;

flag=max_heap(i);//插入的節點是否在最大堆

switch(flag)

{

case true://節點在最大堆

j=min_partner(i);//插入節點在最小堆所對應的節點

if(item

{

heap[i]=heap[j];//交換元素

min_insert(heap,j,item);//把數據item插入到最小堆中

}

else

max_insert(heap,i,item);//否則插入到最大堆中

break;

case false:

j=modified_max_partner(i,n);//插入節點在最大堆中對應的節點

if(item>heap[j])//比較最大堆節點和插入元素的大小

{

heap[i]=heap[j];//交換元素

max_insert(heap,j,item);//插入到最大堆中

}

else

min_insert(heap,i,item);//否則插入到最小堆

break;

}

}

}

int modified_max_partner(int i,int n)

{

double k = log(i)/log(2);

double a = pow(2, (int)k-1);

int j;

j=(i + (int)a);

if(j>n)

return j/2;

else return NULL;

}

程序測試:

#include"Heap.h"

int main()

{

int i,item;

int n=1;

for(i=2;i

{

scanf("%d",&item);

deap_insert(heap,&n,item);

}

for(i=2;i<=n;i++)

printf("%d ",heap[i]);

printf("\n");

item=delete_deap_min(heap,&n);

printf("The deleted data is:%d",item);

printf("\n");

for(i=2;i<=n;i++)

printf("%d ",heap[i]);

return 0;

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530241.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530241.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530241.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言和我的世界指令哪個難,我的世界難度有什么區別 難度選擇指令介紹

我的世界中的難度(Difficulty)可以在Minecraft的選項菜單內切換。更改這個選項將直接影響到游戲本身。選項中并沒有設定影響攻擊性生物的可生成數量&#xff0c;包括和平模式。目前游戲共有和平、簡單、普通和困難4種難度。我的世界難度區別和平&#xff1a;會生成攻擊性生物&a…

w ndows10即將停止更新,微軟開始警告Windows 10 v1909用戶即將停止更新服務

如果您仍在運行Windows 10版本1909&#xff0c;版本1903或更早版本&#xff0c;則可能已經在系統任務欄中注意到一條新消息&#xff1a;Windows 10版本即將終止服務。根據Windows 10 May 2020 Update或2020年10月Update。為了將用戶升級到最新版本的Windows 10&#xff0c;“您…

篩法求素數c 語言,位篩法求素數,有段代碼看不懂,有大佬可以來說一下

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓就是BITArray[ (i -3)/ CHAR_BIT ]其中i從0開始&#xff0c;那下標不就為負了&#xff1f;而指向的又是哪個數據&#xff1f;下面是完整代碼。#include #include #include #include #include #include#include int main( ){unsigne…

c語言中日期間的天數怎么計算,關于計算兩個日期間天數的代碼,大家來看看...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓這是原貼:http://post.baidu.com/f?kz100411727這是原碼:#include "stdio.h"main(){long int i,a[2],b[2],c[2],x[12]{0,31,59,90,120,151,181,212,243,273,304,334},y,z[2];scanf("%ld-%ld-%ld %ld-%ld-%ld"…

linux nf conntrack,Linux基于mark的策略路由以及nf_conntrack RELATED

談到什么是意義&#xff0c;話題總顯得很大&#xff0c;近日每晚都和老城里的朋友聊老城的文化&#xff0c;老城的老房子&#xff0c;老城的叫賣聲&#xff0c;老城的方言…進行了很多的思考&#xff0c;也挺充實。至于技術方面&#xff0c;也有跟朋友以及前同事聊過&#xff0…

android 根據資源名稱,如何在Android中按名稱訪問可繪制資源

你可以做這樣的事情。public static Drawable getDrawable(String name) {Context context YourApplication.getContext();int resourceId context.getResources().getIdentifier(name, "drawable", YourApplication.getContext().getPackageName());return contex…

Android10不能用谷歌,谷歌真的很嚴格,一大波老APP將不能在安卓10.0運行

蘋果iOS的一大優點就是軟件生態&#xff0c;第三方APP都會主動適配新的iOS系統以及手機。雖然說Android的開放性是也是一大優點&#xff0c;但是第三方軟件參差不齊的優化適配水平也讓安卓的用戶非常頭疼。不過谷歌每年都在致力于讓Android的軟件生態更好。根據XDA的報道&#…

android 回歸測試,android測試:monkey使用方法

android測試&#xff1a;monkey使用方法Android Sdk給我們提供了Monkey和Monkeyrunner這兩個自動化測試工具。一、什么是MonkeyMonkey是一個命令行工具&#xff0c;可以運行在模擬器里或實際設備中。它向系統發送偽隨機的用戶事件流&#xff0c;實現對正在開發的應用程序進行壓…

c語言編程季節輸出春夏秋冬,c語言編程題:?用枚類型定義春、夏、秋、冬四個季節...

滿意答案bcabcdefg2013.07.28采納率&#xff1a;49% 等級&#xff1a;12已幫助&#xff1a;5373人#includeenum season{spring 1,summer,autumn,winter,};season GetSeasonByMonth(char month){if(month < 3 && month>1)return spring;else if(month < 6 …

android fragment addtobackstack,Android Fragment Back Stack的問題

我對android片段Backstack的工作方式遇到了一個很大的問題&#xff0c;對于提供的任何幫助將不勝感激。假設您有3個片段[1] [2] [3]我希望用戶能夠導航[1] > [2] > [3]但在返回的途中(按返回按鈕)[3] > [1]。就像我想象的那樣&#xff0c;這可以通過addToBackStack(..…

華為升級harmonyos的機型名單,華為鴻蒙 OS 2.0 系統適配名單已出,四月推送,天璣機型暫時無緣...

原標題&#xff1a;華為鴻蒙 OS 2.0 系統適配名單已出&#xff0c;四月推送&#xff0c;天璣機型暫時無緣華為官方在 2020 年發布了旗下自研系統“HarmonyOS 2.0”版本&#xff0c;發布會現場展示了 HarmonyOS 2.0 開發者 Beta 版本&#xff0c;并開啟開發者 Beta 的公測。此外…

android如何實現QQ信息通知,android NotificationListenerService監聽通知欄(qq 微信 短信)...

【實例簡介】android NotificationListenerService 監聽通知欄&#xff0c;android NotificationListenerService 監聽通知欄 android NotificationListenerService 監聽通知欄【實例截圖】【核心代碼】NLsevice└── NLsevice├── AndroidManifest.xml├── bin│ ├──…

rsync android app,如何rsync到android

問題描述如何連接到我的Android設備以rsync音樂(或其他東西)&#xff1f;最佳解決思路實際上在MTP /usb上使用rsync這比每個人都說的容易&#xff0c;首先注意到當GVFS安裝MTP掛載時&#xff0c;它將在下面可用。您可以通過在圖形file-browser(thunar /nautilus /etc)中打開手機…

android 混合開發 圖片,混合開發的大趨勢之一React Native之Image

文章是寶寶自己寫的&#xff0c;你可以轉走&#xff0c;標明哪來的就行王亟亟的大牛之路國慶這些天要么旅游要么WOW&#xff0c;感覺整個人都廢了。。直接從黃種人曬成了非洲大酋長。。然而還是無橙&#xff0c;這禮拜要做7天&#xff0c;昨天把單元測試的東西整完后今天下午抽…

html5實現無縫滾動的效果,基于JavaScript實現無縫滾動效果

本文實例為大家分享了JavaScript實現無縫滾動效果展示的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下首先應該區分樣式中的絕對定位和相對定位&#xff0c;一般來說&#xff0c;移動的單位為絕對定位&#xff0c;在這個實例中&#xff0c;移動的Ul就是絕對定位 &am…

w3c html5 客戶端緩存數據格式,Html5應用程序緩存(Cache manifest)

一、作用離線瀏覽 - 根據文件規則把資源緩存在本地&#xff0c;脫機依然能夠訪問資源&#xff0c;聯網會直接使用緩存在本地的文件。優化加載速度&#xff0c;節約服務器資源。二、適用場景正如 manifest 英譯的名字&#xff1a;離線應用程序緩存&#xff0c;這項功能是設計給會…

html5內聯框去滾動條,如何優雅的實現內聯滾動條(前端底部固定方法 )

我是一個網易云粉&#xff0c;有沒有發現網易云音樂兩邊的滾動條是互不相干的&#xff0c;而且頭部和底部都是固定的&#xff0c;這是如何實現的呢&#xff1f;先看個圖吧。網易云音樂的頁面其實要實現這樣一個內聯滾動條不難。我們可以先從實現一個內聯滾動條開始實現。實現方…

微型計算機中 輔助存儲器通常包括,第7章 微型計算機存儲器習題參考答案

第七章習題及答案7.1 一個微機系統中通常有哪幾級存儲器&#xff1f;它們各起什么作用&#xff1f;性能上有什么特點&#xff1f;答&#xff1a;一個微機系統中通常有3級存儲器結構&#xff1a;高速緩沖存儲器、內存儲器和輔助存儲器。高速緩沖存儲器簡稱快存&#xff0c;是一種…

html中未填寫完提示未填寫,亞馬遜官方試題(開店及運營篇)

六.玩轉新賬號單選1、可以在亞馬遜網站投放廣告嗎&#xff1f;A:部分可以投放&#xff0c;部分則由亞馬遜控制B:全部不可以C:全部都可以D:只可在網站頁面有責投放 A2、恢復移動板塊初始界面后臺什么位置設置A:無法恢復B:需手動逐一恢復 C:右上角Setting里設置D:左下角設置 D3、…

idea html 錯誤提示,Idea 代碼編輯錯誤不飄紅提示

洛谷P2055 &lbrack;ZJOI2009&rsqb;假期的宿舍 &lbrack;二分圖最大匹配&rsqb;題目描述 學校放假了 有些同學回家了,而有些同學則有以前的好朋友來探訪,那么住宿就是一個問題.比如 A 和 B 都是學校的學生,A 要回家,而 C 來看B,C 與 A 不認識. ...noip模擬賽…