問題描述:把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...