快速面试问题

时间:2015-01-08 16:30:06

标签: algorithm sorting language-agnostic quicksort

最近的一次采访得到了一个问题:

  

考虑一个包含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是否也可以受理。是不是?

3 个答案:

答案 0 :(得分:2)

我声称m1 <= m2是必要且充分的。

  1. 如果是这种情况,在第一次之后我们可以确定m2部分中的m1 + 1 ... n个最小数字位于1 ... m1 + m2前缀内。 m2&gt; = m1,因此m1最小数字位于1 ... m1 + m2前缀内。这意味着在第二轮比赛后他们将处于正确的位置。 m1 + 1 ... n部分的内容并不重要,因为无论如何它都将在上次运行期间修复。

  2. 如果不是这样,很容易建立一个反例:{3,3,1,2,2},m1 = m3 = 2,m2 = 1.

  3. 这意味着: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。

  • a)m1&gt; m2可能无效(如图所示)。
  • b) m1&lt; m2是足够的,因为m1 <= m2
  • c)m1> = m2可能不起作用,因为m1可以>在这种情况下m2和示例证明它是错误的。
  • d) m1 = m2 = m3满足m1 <= m2所以这是A被分类的充分条件。

答案 2 :(得分:0)

最后一次操作不会触及part1,因此part1在第二次运行后必须包含m1个最小的数组项。如果其中一些最初位于part1那就可以了;如果他们在part2,第二轮将他们带到正确的地方;但是part3中的人必须首先转移到part2。如果数组最初的顺序相反,那么必须满足m1>=m2>=m3才能将数组右端的m3个项目带到左侧。类似m1<=m2<=m3似乎有必要保证m1part1的最大项目将转移到part3

最终答案:d。