陣列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這樣空間複雜度主要是reverse中用到,為o(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 }
原地歸併與非原地歸併
看演算法時看到原地歸併和非原地歸併,不是很懂兩者的區別,故記錄如下 原地演算法 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...