In place Merge 原地歸併

2022-05-01 02:54:09 字數 1029 閱讀 1651

陣列al[0,mid-1] 和 al[mid,num-1],都分別有序。將其merge成有序陣列al[0,num-1],要求空間複雜度o(1)

思路:一般的歸併是需要o(n)的空間,而這裡要求空間複雜度為o(1),也就是只能使用常熟級別的臨時變數。而原地操作無非就是移動,關鍵是怎麼移動。在程式設計珠璣中有乙個旋轉演算法(旋轉後k個元素到前面),可以在這裡起到關鍵性作用。見

因為陣列al[0,mid-1] 和 al[mid,num-1],都分別有序,我們要做的是將較小的元素(可能是連續的一片)插入到合理的位置中;不妨假設left 和right是兩個有序陣列中的下標,a[left] < a[right],首先要在左半部分找到第乙個比a[right]大的下標newleft,接著在右半部分找到比a[newleft]小的下表newright,並記錄right到newright所移動的步數move

如上圖所示,最後就是將紅色框中的元素進行右旋轉move(這裡為3)個元素。

**如下:

1

//翻轉陣列

2 template 3

void reverse(t *a, int

size)412

13}14//

旋轉15 template 16

void rotate(t*a, int size, int

pos)

1723 template24

void inplacemerge(t *a, int size, int

mid)

2535 move = 0;36

while ( sec < size && a[sec]

3741 rotate(a + fir, sec - fir, sec - fir -move);

42 fir +=move;43}

44 }

這樣空間複雜度主要是reverse中用到,為o(1).

原地歸併與非原地歸併

看演算法時看到原地歸併和非原地歸併,不是很懂兩者的區別,故記錄如下 原地演算法 in place algorithm 基本上不需要額外輔助的資料結構,然而,允許少量額外的輔助變數來轉換資料的演算法。當演算法執行時,輸入的資料通常會被要輸出的部分覆蓋掉。wiki 那麼我們來看下兩種演算法的 非原地cl...

Numpy原地與非原地操作

原地操作 給陣列分配了一塊兒地,對它進行操作,就是在已有的地上進行翻新播種,任何改變都在原地進行 非原地操作 給陣列重新開闢了一塊兒地,對它進行操作,不會影響原來的值 import numpy as np a np.array 1,2,3 b aa np.array 1,1,1 原地操作,在原有的操...

原地堆排序

siwuxie095 原地堆排序 程式 1 原地堆排序的實現 sorttesthelper.h ifndef sorttesthelper h define sorttesthelper h include include include include include using namespac...