2011-06-26 88 views

回答

6

有兩個(邏輯)指針 - 讓我們稱它們爲x和y。 x指向前n/2個元素的第一個元素。 y指向第二個n/2元素的第一個元素。如果在y處的元素小於x處的元素(我們稱n(y)和n(x)),則在x處插入n(y),並將y加1 x。否則,將x增加1並再次檢查。一旦y點擊'n',停止y並繼續重複直到x == y。

E.g.

2 4 7 8 1 3 5 6 
x  y 

1 2 4 7 8 3 5 6 
    x  y 

1 2 4 7 8 3 5 6 
    x  y 

1 2 3 4 7 8 5 6 
     x  y 

1 2 3 4 7 8 5 6 
     x y 

1 2 3 4 5 7 8 6 
      x y 

1 2 3 4 5 6 7 8 
      x y 

1 2 3 4 5 6 7 8 
       (x,y) 
+2

類似於我的想法,但插入就地意味着移動/交換一系列值 - >慢而不是O(n) – knittl

+0

這不取決於正在使用的數據結構嗎?如果這是一個鏈表,插入是O(1)。但是,我注意到問題是針對數組而不是列表。所以,對於一個數組,它不是O(n)。 – sparkymat

+0

OP寫'數組' – knittl

3

通常爲了排序兩個已排序的列表,您可以使用合併排序;最簡單的方法是將某個半數組複製到某處。這不是就地,但工作。

交換元件不工作的,因爲它不保證該陣列的第一半的最大值小於在右半最小值:

{ 3 4 4 1 2 4 } 

交換I = 0,J = 3

{ 1 4 4 3 2 4 } 

交換I = 1,J = 5

{ 1 2 4 3 4 4 } 

通過在進一步交換的結果修正此O(N^2)氣泡排序。