2011-06-26 87 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)气泡排序。