求证,将五个随机数进行排序,至少需要七次比较!

friendliu 2003-12-07 09:50:19
求证,将随机数五个数进行排序,至少需要七次比较!
哪位高手会呀。。。
...全文
2857 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
PuzzleFan 2003-12-11
  • 打赏
  • 举报
回复
To liuhuimingming91(lam)

应该是 7次
例如a1,a2,a3,a4,a5;
先排(a1,a2);(a3,a4);这样就比较了2次;//'()'表示其内部元素为有序
然后用Max(a3,a4)分别和a1,a2,比较 这样就有 了有序的(a1,a2,a3,a4),这样有又比较了2次
总共4次 然后用a5逐个的跟(a1,a2,a3,a4)中的三个比较就可以得出有序的(a1,a2,a3,a4,a5)

如果Max(a3,a4)>a1,Max(a3,a4)>a2, you cannot make sure (a1,a2,a3,a4),
a1=1 a2=2 a3=3 a4=4,Max(a3,a4)>a1,Max(a3,a4)>a2, (a1,a2,a3,a4)?
a1=1 a2=2 a3=0 a4=4,Max(a3,a4)>a1,Max(a3,a4)>a2, (a3,a1,a2,a4)?




Autom 2003-12-11
  • 打赏
  • 举报
回复
一个有用的结论是对n个数使用基于比较的排序算法,至少需要ceiling(lg(n!))次比较,那么五个数至少需要ceiling(lg(5!))=7次比较。只需证明7次比较可以排序就行了。
如下5个随机的数据:
o o o o o
两次比较后:(对于有边相连的点,上面的大于下面的,右面的大于左面的)
* *
| |
# # o
比较两个*:
*---*
| |
# # o
再用两次比较,将o插入由两个*和左边的#组成的链中,有四种情况:
*---* *---* *---o---* *---*---o
| | | | | | | |
# $ o $ # $ # $
| |
o #
无论哪种情况,我们都可以通过两次比较(注意,我们将原来右边的#换成了$)将$插入到其它四个数中。
所以,7次比较足够了。
boodweb 2003-12-10
  • 打赏
  • 举报
回复 2

将n个数的排序过程看作是在一棵2叉树上寻路(因为每次比较只有2个可能结果),而各种排序结果就是树的叶子,显然有n!个叶子,于是树高至少为h=upper_bound(log2(n!)),于是:
n个数排序至少要upper_bound(log2(n!))次比较

对于n=5,log2(5!)=6.9,即至少7次
liuhuimingming91 2003-12-10
  • 打赏
  • 举报
回复
应该是 7次
例如a1,a2,a3,a4,a5;
先排(a1,a2);(a3,a4);这样就比较了2次;//'()'表示其内部元素为有序
然后用Max(a3,a4)分别和a1,a2,比较 这样就有 了有序的(a1,a2,a3,a4),这样有又比较了2次
总共4次 然后用a5逐个的跟(a1,a2,a3,a4)中的三个比较就可以得出有序的(a1,a2,a3,a4,a5)
BlueSky2008 2003-12-09
  • 打赏
  • 举报
回复
那就是用对手论证法。
IT_worker 2003-12-09
  • 打赏
  • 举报
回复
从前面2,3,4,5几个数来看f(n)似乎满足
log2(n!)<f(n)<log2(n!)+1
但如此精确的界证明起来恐怕非常难,所以上面给出一个稍微宽松的界。
IT_worker 2003-12-09
  • 打赏
  • 举报
回复
定义f(n)为决定n个数的序所需要的最少比较次数,那么本人猜想:
log2(n!) < f(n) < log2(n!)+log2(n)
这里log2(x)表示x对2的对数。
willbin 2003-12-09
  • 打赏
  • 举报
回复
最多的比较次数是4+3+2+1=10次.
willbin 2003-12-09
  • 打赏
  • 举报
回复
求证,将随机数五个数进行排序,至少需要七次比较!
哪位高手会呀。。。



"至少需要"的意思不是说在最佳情况下的比较次数吗?!
短歌如风 2003-12-09
  • 打赏
  • 举报
回复
>...若选一数(c)与其他四数比较,恰有两个(a,b)比它大,有两个(d,f)比它小,...

若“恰好”这个数比其它数都小呢?

主要是楼主描述的不是很清楚,应该是对5个数的随机序列排序,最差情况下的比较次数最少是7次。就是说你编写一个排序算法对长度为5的序列排序,要达到无论序列处于哪一种排列,比较次数不超过N,则N>=7。否则单纯论“最少比较次数”,那4次就够了。
willbin 2003-12-09
  • 打赏
  • 举报
回复
用六次也可以呀!(七次不是最少的.)
例如:a,b,c,d,e五个数,若选一数(c)与其他四数比较,恰有两个(a,b)比它大,有两个(d,f)比它小,此次比较有四次.现分别比较(a,b)和(d,f),(假如a>b,d>f),则须比较两次.
可知大小顺序为a>b>c>d>e.共比较4+2=6次!
短歌如风 2003-12-08
  • 打赏
  • 举报
回复
例证法只能证明“可以”用7次比较完成,不能证明“至少”。

5个元素的全排列为5!=120,每次比较都可以把这些排列均分为二,则6次比较可以把排列分为2^6= 64组。因此必然至少有两个不同排列分在同一组,而这两个排列顺序不同,无法用同一交换序列完成排序。因此,无法用小于7次的比较次数完成排序。
PuzzleFan 2003-12-08
  • 打赏
  • 举报
回复
楼上第二步(再取另外两个数比较)有问题,此处还遗漏一种情况:
取第三数与刚参与比较的两数比较。

因此只证明这种方式>>>可以<<<通过7次比较排序,不是>>>所有<<可能方式。
levinjoe 2003-12-08
  • 打赏
  • 举报
回复
发信人: starfish (好好学习,天天向上), 信区: Algorithm
标 题: Re: 一个弱弱的问题,请高手指教
发信站: 南京大学小百合站 (Sun Sep 21 20:12:39 2003)

5个数通过7次比较排序的方法如下。

5个数之间的大小关系构成的一个树形图T。T中的一个结点代表一个数,而一条边代表它所

关联的两个数的大小关系,T的根就是中位数。显然T中的一条边要由一次比赛来确定。在

面的图中,如果x大于y,则节点x在节点y的上方且x和y有一条边相连。另外,*表示一般的

数,o表示下一次即将进行比较的两个数。

第1步,先任取两个数比较,结果为:

*
|
* o o *

第2步,再取另外两个数比较,结果为:

o o
| |
* * *

第3步,按照上图比较其中两个标记为o的数,比较结果只有一种情况:

*
/ \
o *
|
* o

第4步,按照上图比较其中两个标记为o的数,比较结果有两种情况:

o o *
\ / \ / \
* * * *
| / \
* o o

第5步,按照上图比较其中两个标记为o的数,比较结果有两种情况:


* *
| / \
* * o
/ \ |
o o o
| |
* *

第6步,按照上图比较其中两个标记为o的数,比较结果有三种情况:

* * *
| | / \
* * o o
| | \ /
* * *
| / \ |
* o o *
|
*
其中第一种情况已经排好序了
第7步,按照上图比较其中两个标记为o的数,比较结果只有一种情况:

*
|
*
|
*
|
*
|
*

所以只需要7步比较就可以把5个数排好序







--
※ 来源:.南京大学小百合站 http://bbs.nju.edu.cn/[FROM: 220.114.110.215]
gushaoping 2003-12-08
  • 打赏
  • 举报
回复

TAOCP是本什么书
friendliu 2003-12-07
  • 打赏
  • 举报
回复
哥们,看不懂,解释一下吧。。大侠。。。
HUNTON 2003-12-07
  • 打赏
  • 举报
回复
7次比较把5个字母按顺序排列

void Compare(int A, int B, int C, int D, int E)
{
if(A<B)
swap(A, B);
// --> A>B
if(C<D)
swap(C, D);
// --> (A>B) && (C>D)
if(A<C){
swap(A, C);
swap(B, D);
}
// (A>B) && (C>D) && (A>C) --> A>B && A>C>D
if(E>C){ // A>B && A>C>D && E>C
if(A>E){ // --> A>B && A>E>C>D
if(B>C){ // --> A>B>C && A>E>C>D
if(B>E) // --> A>B>E>C>D
printf("%d>%d>%d>%d>%d", A,B,E,C,D);
else // --> A>E>B>C>D
printf("%d>%d>%d>%d>%d", A,E,B,C,D);
}else{ // (A>B && A>E>C>D) && B<C --> A>E>C>D && C>B
if(B>D) // --> A>E>C>B>D
printf("%d>%d>%d>%d>%d", A,E,C,B,D);
else // --> A>E>C>D>B
printf("%d>%d>%d>%d>%d", A,E,C,D,B);
}
}else{ // (A>B && A>C>D && E>C) && A<E --> E>A>C>D && A>B
if(B>C){ // --> E>A>B>C>D
printf("%d>%d>%d>%d>%d", E,A,B,C,D);
}else{ // (E>A>C>D && A>B) && B<C --> E>A>C>D && C>B
if(B>D)// --> E>A>C>B>D
printf("%d>%d>%d>%d>%d", E,A,C,B,D);
else // --> E>A>C>D>B
printf("%d>%d>%d>%d>%d", E,A,C,D,B);
}
}
}else{// (A>B && A>C>D) && E<C --> A>B && A>C>D && C>E
if(E>D){// --> A>B && A>C>E>D
if(B>E){ // --> A>B>E && A>C>E>D
if(B>C)// --> A>B>C>E>D
printf("%d>%d>%d>%d>%d", A,B,C,E,D);
else// --> A>C>B>E>D
printf("%d>%d>%d>%d>%d", A,C,B,E,D);
}else{ // (A>B && A>C>E>D) && B<E --> A>C>E>D && E>B
if(B>D) // --> A>C>E>B>D
printf("%d>%d>%d>%d>%d", A,C,E,B,D);
else // --> A>C>E>D>B
printf("%d>%d>%d>%d>%d", A,C,E,D,B);
}
}else{ // (A>B && A>C>D && C>E) && E<D --> A>B && A>C>D>E
if(B>D){ // --> A>B>D && A>C>D>E
if(B>C) // --> A>B>C>D>E
printf("%d>%d>%d>%d>%d", A,B,C,D,E);
else // --> A>C>B>D>E
printf("%d>%d>%d>%d>%d", A,C,B,D,E);
}else{ // (A>B && A>C>D>E) && B<D --> A>C>D>E && D>B
if(B>E) // --> A>C>D>B>E
printf("%d>%d>%d>%d>%d", A,C,D,B,E);
else // --> A>C>D>E>B
printf("%d>%d>%d>%d>%d", A,C,D,E,B);
}
}
}
}
saint001 2003-12-07
  • 打赏
  • 举报
回复
搜索
http://search.csdn.net/expert/topic/6/603/2002/11/27/1210587.htm
BlueSky2008 2003-12-07
  • 打赏
  • 举报
回复
TAOCP 上讲到的。最少比较排序。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧