歸併排序空間複雜度O 1 的實現

2021-07-14 02:50:50 字數 901 閱讀 9218

正常的歸併排序是利用分治法,即分解,解決,合併

//o(n)membery mergesort

public

void

mergesort(int nums)

private

void

helper(int nums1,int b, int e)

}void merge(int nums1,int b, int m,int e)

else nums2[k++] = nums1[j++];

}while(i <= m)

while(j <= e)

for(int ii = b; ii <=e; ii++)

}

顯然利用臨時陣列,空間複雜度為o(n)

倘若在merge操作時,可以只使用o(1)的空間。

答案是可以的!!

首先讓我們熟悉一下旋轉的操作。

旋**

比如: abcdefg 以d為軸心旋轉,得到efgabcd,可以通過如下演算法實現。

步驟1:對abcd和efg進行reverse ,得到dcba gfe

步驟2:對整體進行reverse,即得到結果 efg abcd

在merge時:

比如:2468 3578 l1:2468 l2:3578,要將l1和l2合併

步驟:

1、確定3在整體中的位置,即在2和4之間。

2、對 468 3進行上述旋轉操作

1、各自reverse 864 3

2、整體reverse 3 468

3、repeat 直至陣列越界。

t(n) = 2t(n/2)+o(2n)

o(nlg2n)

歸併排序,空間複雜度O 1 的實現

思路 利用原陣列a的空間,兩個下標i和j分別遍歷l1和l2。注意 當l2當前元素較小時,會覆蓋l1的元素。可以利用插入排序,將arr j 插入到l1中。程式c 實現 include include using namespace std void print int arr,int start,in...

歸併排序,空間複雜度O 1 的實現

題目 陣列a,前面一段是l1,後面一段l2。兩個有序序列l1和l2,利用歸併排序的merge,將陣列a排序。要求 空間複雜度為o 1 思路 利用原陣列a的空間,兩個下標i和j分別遍歷l1和l2。注意 當l2當前元素較小時,會覆蓋l1的元素。可以利用插入排序,將arr j 插入到l1中。程式c 實現 ...

O 1 空間 的歸併排序

2.2 初始化 2.3 迭代 2.4 終止 三 實現 四 效能 歸併排序的主演算法 public void mergesort int t,int low,int high int mid low high 1 mergesort t,low,mid mergesort t,mid,high mer...