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