合併陣列 雙針模型,原地實現

2021-09-03 08:56:57 字數 1701 閱讀 4812

給定兩個陣列

a = [4,5,6,9,0,0,0]

b = [1,2,3]

最後輸出[1, 2, 3, 4, 5, 6, 9]

def

sorttwosortedarry

(a,b)

: b_num =

len(b)

a_num =

len(a)

-b_num

li =

i ,j =0,

0# 雙針模型從左往右掃瞄,終止條件是,只要任意乙個陣列走完了,

# 走完了沒有完的那個陣列直接接上就行了

while iif a[i]

<= b[j]:)

i +=

1if b[j]

< a[i]:)

j +=

1# 沒走完的直接把尾巴接上去

li += a[i:a_num]

li += b[j:b_num]

return li

def

sorttwosortedarry_in_place

(a,b)

: b_num =

len(b)

total_num =

len(a)

a_num = total_num-b_num

# 原地方式,就需要倒著放,這個也是比較一般的思路

# 原地操作一般想法,一是,取出乙個元素放在空中,留出乙個空

# 二是純粹通過交換來實現

# 三是,**有空位就往**放,倒著放是一種思路

# 指向陣列a的陣列

i = a_num-

1# 指向陣列b

j = b_num-

1# 最終結果的指標

k = total_num-

1while i >=

0and j>=0:

if a[i]

>= b[j]

: a[k]

= a[i]

i -=

1 k -=

1if b[j]

> a[i]

: a[k]

= b[j]

j -=

1 k -=

1# 把尾巴接上

# a[:i+1] = a[:i+1]

a[:j+1

]= b[

:j+1

]

a =[4

,5,6

,9,0

,0,0

]b =[1

,2,3

]print

(sorttwosortedarry(a,b)

)print

(a)sorttwosortedarry_in_place(a,b)

print

(a)runfile(

'd:/share/test/arry_and.py'

, wdir=

'd:/share/test')[

1,2,

3,4,

5,6,

9][4

,5,6

,9,0

,0,0

][1,

2,3,

4,5,

6,9]

原地合併兩個有序陣列

昨天看到一篇關於合併兩個陣列的題目 在乙個大陣列a n a 0 a mid 1 和a mid a n 1 分別有序,怎樣在o 1 的空間複雜度下完成將兩個子陣列合併到a n 中。一開始想到了直接插入排序,前面是有序的嘛,直接從第mid個開始往前面插,這樣一來空間複雜度滿足要求,但是時間複雜度為o n...

陣列實現雙堆疊

在乙個陣列中實現兩個堆疊 20 分 本題要求在乙個陣列中實現兩個堆疊。stack createstack int maxsize bool push stack s,elementtype x,int tag elementtype pop stack s,int tag 其中tag是堆疊編號,取1...

陣列實現雙鏈表

之前寫了陣列實現單鏈表,提到了陣列實現鍊錶比指標實現最大的優點就是快,可以隨機訪問,而且不用new節點。在圖論的題目裡用到鄰接表,往往都是用陣列實現。陣列實現雙鏈錶比單鏈表就多了一些對於左指標的操作。為了實現的方便,不像在單鏈表實現裡用乙個額外的變數head去記錄鍊錶的頭節點。而是直接用兩個哨兵節點...