我在麻省理工学院的一些期中考试或期末考试中看到以下问题以相同方式重复和重复。
我们在一个排序算法的某个步骤中显示一个数组。
5,3,1,9,8,2,4,7
2,3,1,4,5,8,9,7
1,2,3,4,5,8,9,7
1,2,3,4,5,8,7,9
1,2,3,4,5,7,8,9
使用了哪种插入排序/快速排序/合并排序/交换排序?
我如何找到这个问题的解决方案? ?
编辑:我认为这是快速排序,因为每个级别的某些元素低于数据透视,而某些元素的数量大于数据透视....
答案 0 :(得分:1)
它应该是快速排序,不仅因为分区的证据,而且还有这个有趣的事实:在某种程度上,只有一部分数组发生了变化。
现在让我们讨论每个算法:
插入排序会为您提供一个必须排序前几个元素的模式,但显然我们没有这种模式;
如果前一个元素大于后一个元素,冒泡排序(交换排序)将继续交换邻居,因此最后k
元素将在k
之后排序迭代。基于这两个事实,我们将不会有一对在每次迭代后存在(a, b)
的邻居b < a
。但是,序列不遵循这一点,比如说第一个序列中的术语(3,1)仍然存在于第二个序列中。
合并排序首先将数组拆分为2 + 2 + 2个子阵列,然后将其合并为4 + 4,最后是8个元素的排序数组,所以完全应该采取3个步骤,但我们有这里有4个步骤,所以不会合并排序。
答案 1 :(得分:1)
在这种情况下,你可以a)找到一些模式,如果你认为有一个或b)去简单消除。让我们尝试淘汰:
1)它不能插入排序,因为插入排序从头开始,并将范围[0,k]视为已检查值的已排序子数组。然后它一个接一个地继续,所以我们首先在3
之前插入5
等,就像我们首先将[5]
视为大小为1的排序子数组并插入3
进入它,因为它是整个数组中的下一个值。
2)合并排序会首先对邻居进行排序,因为它会首先递归地将整个数组视为单个元素数组,然后返回递归树并合并neigbors,如下所示:
[3,5],[1,9],[2,8],[4,7]
[1,3,5,9],[2,4,7,8]
[1,2,3,4,5,6,7,8]
[]
显示每个步骤对哪些部分进行了分类。
这意味着一次传递后邻居将被排序。
3)交换排序也会有不同的顺序 - 第二行应该以{{1}}开头,因为你要交换3
和5
,然后是3
和{{ 1}}等在第一遍。因此,如果我的冒泡排序正确,我们会在5
之后从1
转到5,3,1,9,8,2,4,7
。我们比较每一对并交换3,1,5,8,2,4,7,9
处的元素是否大于i+1
处的元素。这样最后一个元素将是最大的。
4)正如你公平指出这是快速排序,因为在每一步中我们都可以清楚地看到阵列绕一个特定值4旋转,然后你将左半部分绕2旋转,右半部分围绕5等旋转。
粗体部分是我所谈论的模式,现在既然你知道它们就可以轻松检查它是哪一个: - )