【Code】对于一个有5个元素的数组,最少需要几次比较才能保证数组有序?

问题

对于一个有5个元素的数组,最少需要几次比较才能保证数组有序?
A. 5次
B. 6次
C. 7次
D. 8次

答案

C

引理

2次比较可以将一个未知的元素插入到一个有3个元素的有序数列中并且保证插入完成后数列有序。

引理的证明

设未知数是x,原始数列为a、b、c,且a<b<c,首先将x和b比较大小,不妨设x<b,c<d。接着比较b、d大小,不妨设b<d,然后将x与a比较大小,若x小,则x<a<b<c,否则a<x<b<c;如果x>b,则将x与c比较大小,与前者同理。引理得证。

问题的分析

回到原问题,不妨设这5个数为a、b、c、d、e,首先比较a、b大小,比较c、d大小,不妨设a<b、c<d。接着比较b、d大小,不妨设b<d,于是,得到一个长度为3的有序序列a<b<d,同时知道c<d,根据引理,用2次比较将e插入到a、b、d这个数列中。由于已知c<d,于是c最多只与a、b、e三个数确定相对大小(若e>d,则c<d<e,c与e的相对大小也已经确定了),而且a、b、e这三个数之间的相对大小已确定,不妨设a<b<e,根据引理,我们可以用两次比较将c插入到a、b、e这个序列中,又因为已知a、b、c、e都比d小,于是这5个数排序完毕,我们一共用了7次比较。

引入决策树

下面引入决策树的概念说明6次或更少不可能的原因。

决策树一般都是自上而下的生成的。每个决策或时间(即自然状态)都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很想一棵树的枝干,故称决策树。

对于排序事件,每一个不同的状态是一组比较的结果如a<b,若为真,则会引发一些结果,若为假,又会引发另一些结果,而最终的结果就是这5个元素的相对大小关系,易知共有5!=120种大小关系,因此决策树的叶子节点一共有120个。

又显然决策树中每个状态都只有真和假两种可能,故这个决策树是一棵二叉树,而一棵决策树的深度决定了这种排序的比较方法最少要比较多少次才能保证确定这5个树的顺序。因为120>26,于是深度为6或更少的比较次数无法保证确定5个数的大小关系。

综上,5个元素至少需要7次才能保证元素可以被排好序。

推论

一个更一般的问题:对于任意的N,至少需要多少次才能保证排好序?令人遗憾的是,这个问题至今没有明确的解答,但根据上文对决策树的分析,一个显然的事实是。比较次数的下限是否对每个N都能达到,还是一个未知数。更详细更深入的讨论可参考Donald E. Knuth的名著《计算机程序设计艺术》(The Art of Computer Programming)第3卷第5章第3节中的《《最优培训·极小比较排序》部分。

不过我们可以由此产生一个显然的推论,就是基于比较的排序算法的时间复杂度下限是O(NlogN)。渐近时间复杂度的计算会忽略低阶函数,于是[NlogN]-N=O(NlogN)。

猜你喜欢

转载自blog.csdn.net/Ljnoit/article/details/108985635