给定输入数组为60,80,15,95,7,12,35,90,55,条件为选择第一个元素作为枢轴,现在给定输入可以有多少布置,以便输出为quicksort的第一次传递给出了相同的结果?
我尝试了一些排列,并且对于每个排列我在第一次传递中得到相同的输出但我无法得到这背后的逻辑,所以我改变了输入数组然后尝试了,我发现它给出了不同的结果所以这个效果取决于输入数组对给定输入数组的某些特定排列给出相同结果的因素,请概括这个术语。
答案 0 :(得分:3)
如果我们想在第一次传递后保持相同的输出,我们必须不做的是改变将出现在枢轴同一侧的任何元素的顺序 - 也就是说,任何一对<= 60
或> 60
元素的元素。这样做会改变它们在最终输出中出现的顺序。如果一个元素是<= 60
而另一个元素是> 60
,则可以更改一对元素的顺序。
因此,对于每个类别(<= 60
和> 60
),我们需要事先为其元素选择正确的顺序,而不是违反此顺序。这意味着我们实际上正在做的是合并两个列表 - 一个按照我们希望它们出现的顺序包含所有项<= 60
,另一个按我们想要的顺序包含所有项> 60
他们出现了。也就是说,如果我们从一个列表中按顺序获取一些元素,然后按顺序从另一个元素中按顺序获取一些元素,并重复此操作直到两个输入列表都为空,那么所采用的元素序列将在1次快速通过后生成所需的最终订单。
那么,有多少种方法可以做到?有5个数字<= 60
:15,7,12,35,55和3个数字> 60
:80,95,90。我们可以描述生成合并序列所涉及的选择顺序0和1的序列,0表示“从<= 60
列表中取出下一个元素”,1表示“从> 60
列表中取出下一个元素”。那么我们想要知道的是0和1的不同序列的数量,它们恰好包含5 0和3 1 - 或者相当于,在0到3的序列中选择5 + 3 = 8个位置中的3个的方式的数量变成1s。那是8 choose 3
或8!/3!5! = 56
。这将对每个可能的有效合并进行一次计数,因此有56种方法可以对60,80,15,95,7,12,35,95,55的最后8个元素进行排序,以便在快速排序1次后生成特定的输出序列。
答案 1 :(得分:1)
首先让我告诉你在第一次传递后快速排序会发生什么,并且第一个元素被视为枢轴,枢轴元素将移动到其确切位置,即所有小于枢轴的元素将留给它并且更大到它是正确的。它的相对位置相对较小(即15,7,12小于60将是相同的相对顺序,意味着7是15之后和12之前),除了它之前将被枢轴取代的那个。
在你的例子60,80,15,95,7,12,35,90,55中,一旦你将60作为枢轴,那么所有小于60的元素应该处于与它相同的相对位置。以上顺序。因此,获得所有这些排列,我们需要保持以下条件
所以这个完整的问题,减少到选择5个地方(小于枢轴的元素数)形成8个地方(除枢轴之外的总数)。所以这将是8C5或8C3。
答案 2 :(得分:0)
让我们说,元素> 60是A,B和C,元素<= 60是a,b,c,d和e。在第一遍分区算法之后,我们总是想要序列- a,b,c,d,e,60,A,B,C
现在,如果我们在输入数组中选择任意3个位置(P1,P2,P3)来放置大于60的元素,例如-
60,_,P1,_,P2,_,_,P3,_
然后,在第一遍分区之后,我们将得到一个序列,其中P1,P2和P3在60的右边,但是顺序是任意的。可以说,我们得到了-
_,_,_,_,_,60,P3,P1,P2
与所需的输出序列相比,我们可以说-
将A置于P3,
将B放在P1,
将C置于P2
输入数组中的,即
60,_,B,_,C,_,_,A,_
给出所需的输出顺序。
通过上述分析,我们可以说对于元素> 60选择的任何3个位置,我们总是可以通过回溯这些位置来获得所需的输出序列。 现在,我们可以通过几种方式为> 60的元素选择任意3个位置? 答案是8C3(从8个项目中选择任何3个项目的方式数目;在我们的情况下,项目是指排名)= 56。
注意-在元素> 60留空的位置,我们可以将元素<= 60排在顺序中-
b c,d,e,a
以便在分区的最后一步,将60替换为“ a”以提供所需的输出顺序-
a,b,c,d,e