合併有序陣列的時間複雜度

2021-09-18 05:09:02 字數 907 閱讀 9071

合併已有排序陣列的最優和最差情況:

如果是兩個陣列:

最壞的情況就是交叉的情況:

比如1  3  5

2  4  6

設上鏈指標p,下鏈q,每次比較後較小節點依次作為「合併後鍊錶的節點」,同時較小鏈指標後移。某鏈指空後不再比較。則樓上所給的第乙個例子:第一步:1和2比,1小作為新節點,p移至3。第二步,3和2比,2小作為新節點,q移至4。第三步,3和4比,3小,p移至5。第四步,5和4比,4小,q移至6。第五步,5和6比,p指空。結束一共比較了5次=3+3-1。

最壞的情況實質上是讓兩指標都走完各自的鍊錶,同時某鏈肯定先走完,因為一次只移動乙個指標,另乙個鍊錶無論怎樣都會至少少走一步,這就是m+n-1的含義。(參考:原文:

最好的情況就是:

最好情況下:比較次數為 min

有個疑問: 若乙個陣列為 1, 2,3 ; 另乙個陣列為 4, 5, 6, 7; 則直接將後乙個陣列最小的與前乙個陣列最大的比較,僅需一次比較就行了,一定要注意,這是簡單歸併排序,必須從第乙個元素比。

因此,最好情況下,至少需要兩兩比較乙個陣列的長度,比較次數為 min

(參考:原文:

如果是:

排序時,若不採用計數排序等空間換時間的方法,合併m個長度為n的已排序陣列的時間複雜度最優為:

這個時候要用到堆排序:

合併m個長度為n的已排序陣列的時間複雜度為o(nmlogm)

思路是:首先將m個已排序陣列的第乙個數,建立大小為m的小根堆,時間複雜度o(m)。對於以第乙個元素建立起來的小根堆,重建過程需要logm,一共有m個這樣的元素所以第乙個小根堆完全輸出需要的時間複雜度是m*logm(堆排序的時間複雜度logmm包括了初始化的o(m),因為這個只有剛開始的初始化過程需要這麼一次),一共需要建立起n個這樣的小根堆,所以需要的時間複雜度為logmmn。

合併有序陣列

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述 給你兩個有序且公升序的陣列,請你把它們合成乙個公升序陣列並輸出 give you two ordered ascending array,you put them into one ascending array and ou...

合併有序陣列

描述 給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 num1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素。...

合併有序陣列

給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 nums1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素。vo...