把k個有序表合併成乙個有序表

2021-06-18 22:30:27 字數 1446 閱讀 1114

問題描述:把k個有序表合併成乙個有序表.元素共有n個.

分析: 本題考查的是通過二叉堆實現優先佇列,而下面的二叉堆採用順序表的結構儲存

大致思路:先從每個序列中取出乙個元素,接著建立k個節點大小的小根堆,輸出小根堆堆頂數值;

①若堆頂元素所在序列沒有結束,則將堆頂元素所在序列的下乙個元素替換掉堆頂,接著重新調整堆;

②若堆頂元素所在序列已經結束,則刪除堆頂元素,此時堆大小減1,接著在重新調整剩下的堆;

依次,可以得到排序後最終序列

#include

#include

#define n 25               //總共存在的元素

#define list_size_k     5     //定義每個序列的大小,這裡假設為5

//定義每個堆節點的元素型別

typedef structelemtype;

//定義順序表,儲存堆元素

typedef structsqlist;

typedef sqlist heaptype;

/*調整當前節點,使得滿足小根堆*/

heaptype heapadjust(heaptype h,int s,int m)

if(rc.key

break;

h.r[s]=h.r[j];

s=j;

}h.r[s]=rc;

return h;

}/*根據元素t,替換掉堆頂元素*/

heaptype changeheap(heaptype h,elemtype t)

/*根據給出的陣列序列, 初始化堆陣列*/

heaptype initheap(heaptype h, int arr[list_size_k])

return h;

}/*刪除堆頂,將最後乙個元素移到堆頂,並返回刪除後未調整的堆*/

heaptype deleteheap(heaptype h)

/*按照陣列的形式, 返回陣列指標,指向排序後的序列*/

int *heapsort(heaptype h, int *sortarr,int arr[list_size_k])

else

h=heapadjust(h,1,h.length);     //自頂向下,重新調整堆

sortarr[i++]=h.r[1].key;     //取堆頂值儲存

}return sortarr;

}int main()

,,,,};

heaptype h;

h=initheap(h,arr);     //初始化堆陣列

sortedarray=heapsort(h,sortarrs,arr);

for(i=0;i

}printf("\nk路序列歸併後元素:");

for(i=0;i

printf("\n");

return 0;}

兩個有序鍊錶合併成乙個有序鍊錶

private static node mergetwolists node list1,node list2 if list2 null 定義了兩個引用,用來遍歷鍊錶 node cur1 list1 node cur2 list2 新鍊錶的頭結點和尾結點 空鍊錶,所以都是 null node nh...

將兩個有序鍊錶合併成乙個有序鍊錶

c codes as below class link public static link mergesortedlink link firstlink,link secondlink while currentnode2.next null else if currentnode1 null r...

將兩個有序鍊錶合併成乙個有序鍊錶

題目 給定兩個有序的鍊錶,編寫乙個函式來合併這兩個鍊錶,並且返回乙個新的有序的鍊錶 分析 這兩個鍊錶已經有序,所以,只需要對著兩個鍊錶的元素依次進行比較即可,這是對兩個鍊錶操作的基本問題。include stdafx.h include using namespace std struct list...