最近的一次采访得到了一个问题:
考虑一个包含n个元素的数组,它分为三个部分:
A[1] .....................................................A[n] part1(m1)..........part2(m2)......... part3(m3)
然后对它进行三次快速排序,如下所示
QuickSort(A[m1+1.....n]) QuickSort(A[1.....m1+m2]) QuickSort(A[m1+1.....n])
在什么条件下对数组进行排序?
a) m1>m2 b) m1<m2 c) m1>=m2 d) m1=m2=m3
我的回答是m1>m2
,但现在我怀疑m1>=m2
是否也可以受理。是不是?
答案 0 :(得分:2)
我声称m1 <= m2
是必要且充分的。
如果是这种情况,在第一次之后我们可以确定m2
部分中的m1 + 1 ... n
个最小数字位于1 ... m1 + m2
前缀内。 m2
&gt; = m1
,因此m1
最小数字位于1 ... m1 + m2
前缀内。这意味着在第二轮比赛后他们将处于正确的位置。 m1 + 1 ... n
部分的内容并不重要,因为无论如何它都将在上次运行期间修复。
如果不是这样,很容易建立一个反例:{3,3,1,2,2},m1 = m3 = 2,m2 = 1.
这意味着:b)和d)都是正确的。
答案 1 :(得分:1)
考虑
的情况A = 3 3 3 2 2 1
m1 = 3, m2 = 2, m3 = 1, n = 6
如果我们按照给定的方式使用quicksort(qs)进行排序:
qs(A[3+1..6]) -> 3 3 3 [1 2 2]
qs(A[1..2+3]) -> [1 2 3 3 3] 2
qs(A[3+1..6]) -> 1 2 3 [2 3 3]
最终结果:1 2 3 2 3 3未分类。
在这种情况下,结果未排序,因为m2小于m1,因此使用第2部分作为(某种)缓冲区,最小m1值不能从第3部分转移到第1部分。所以我们必须有m1 <= m2。
答案 2 :(得分:0)
最后一次操作不会触及part1
,因此part1
在第二次运行后必须包含m1
个最小的数组项。如果其中一些最初位于part1
那就可以了;如果他们在part2
,第二轮将他们带到正确的地方;但是part3
中的人必须首先转移到part2
。如果数组最初的顺序相反,那么必须满足m1>=m2>=m3
才能将数组右端的m3
个项目带到左侧。类似m1<=m2<=m3
似乎有必要保证m1
中part1
的最大项目将转移到part3
。
最终答案:d。