排序数组与前半部分和后半部分排序

时间:2011-06-26 10:25:28

标签: c algorithm

  

可能重复:
  Regarding in-place merge in an array

偶然发现了这个采访问题。 给定一个大小为n的数组,其中第一个n / 2被排序,而后半部分被排序 排序。对整个阵列进行排序。 现在我能想到的有点像插入排序,它的空间复杂度为O(1),但时间复杂度将超过O(n)。 这个问题是否可以采用O(n)就地解决方案?

2 个答案:

答案 0 :(得分:5)

有两个(逻辑)指针 - 让我们称之为x和y。 x指向前n / 2个元素的第1个元素。 y指向第二个n / 2元素的第一个元素。

如果y处的元素小于x处的元素(让我们调用n(y)和n(x)),则将n(y)插入x并增加x& y乘以1.否则将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) 

答案 1 :(得分:2)

通常,为了对两个已经排序的列表进行排序,您将使用合并排序;最简单的方法是在某处复制一个半数组。这不是就地,但有效。

交换元素不起作用,因为它不能保证数组前半部分的最大值小于右半部分的最小值:

{ 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)冒泡排序。