演算法導論第六章6 5有限佇列中的6 5 9課後練習

2021-06-20 01:40:01 字數 1299 閱讀 7822

由題目提示知,需要用到歸併排序,又要用到最小堆,那麼我想到用含有最小堆排序的歸併排序對k個有序陣列進行合併因為鍊錶可以看成特殊的動態陣列,那麼我把鍊錶替換成陣列求解。先把k個陣列放入到乙個新陣列a中,那麼一共就有k=n/a個陣列(a為k個元素陣列中所含最多元素的數量)

#include using namespace std;

const length=100;

int left(int i);

int right(int i);

void min_heapify(int a,int i);

void build_min_heap(int a,int p,int q);

int* heapsort(int a,int b,int p,int q,int r);

void merge(int a,int p,int q,int r);

void merge_sort(int a,int p,int r,int k);

int heap_size=length,a=4;

void main()

,,,,,,,};//這是k=8個陣列在乙個2維陣列中

int a[length]=;

for(int i=0,h=0;i<8;i++)//將k=8個陣列合併到乙個新陣列中。

}//這個雙重迴圈含k*a=n個元素 執行時間為o(n)

merge_sort(a,0,length-1,a);//然後將新陣列每a=4個有序數進行歸併,注意a值的選擇 2<=a<=√總元素n(注釋1)

cout<<"排序後:"<0)

cout<=p;i--)

}int* heapsort(int a,int b,int p,int q,int r)

return b;

}void merge(int a,int p,int q,int r)

else if (r[j]==flag)

else if (l[i]>=r[j])

else

}}void merge_sort(int a,int p,int r,int k)

{ int q=(r+p)/k;

if((q-p+1)

注釋1:詳情見這個是帶有插入排序的歸併演算法(此鏈結裡面的k元素長度值相當於這裡的a元素長度值)也就是每個有序陣列(共k個)含有有效元素的長度不能大於總元素的開方,這是能夠正確進行歸併排序的先決條件。這個歸併排序,執行時間為o(nlgn),沒有到達o(nlgk),實在想不出如何縮短執行時間的方法了。

演算法導論第六章6 5優先佇列課後答案。

6.5 1 試說明heap extract max在堆a 上的操作過程。heap extract max a if a.heap size 1 堆中元素是否為空 error heap underflow 如果是空的,那麼返回錯誤 max a 1 將最大堆最大元素也就是第乙個元素儲存起來 a 1 a ...

演算法導論第六章之 優先佇列

優先佇列類模版實現 buildmaxheap.h標頭檔案 includeusing namespace std define left i i 2 1 define right i i 2 2 define parent i i 1 2 void max heapify int a,int leng...

演算法導論 第六章學習筆記

從第六章開始,我們開始了第二部分排序和排序統計學的學習。第六章介紹的是堆排序,本章講了以下幾個內容 1 介紹堆的概念,以最大堆為例 2 保持堆性質的演算法max heapify 3 建堆的演算法build max heap 4 堆排序演算法heapsort 5 優先順序佇列 1 堆 定義 二叉 堆資...