7次比较把5个字母按顺序排列
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个有用的结论是对n个数使用基于比较的排序算法,至少需要ceiling(lg(n!))次比较,那么五个数至少需要ceiling(lg(5!))=7次比较。只需证明7次比较可以排序就行了。
如下5个随机的数据:
o o o o o
两次比较后:(对于有边相连的点,上面的大于下面的,右面的大于左面的)
* *
| |
# # o
比较两个*:
*---*
| |
# # o
再用两次比较,将o插入由两个*和左边的#组成的链中,有四种情况:
*---* *---* *---o---* *---*---o
| | | | | | | |
# $ o $ # $ # $
| |
o #
无论哪种情况,我们都可以通过两次比较(注意,我们将原来右边的#换成了$)将$插入到其它四个数中。
所以,7次比较足够了。
Top
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个数排好序
void Compare(int A, int B, int C, int D, int E)
{
if(Aswap(A, B);
// --> A>B
if(C
// --> (A>B) && (C>D)
if(A
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
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
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
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
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
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
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
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);
}
}
}
}