n个数排序,最坏情况下的最小交换次数是多少呢?

benbebnmao 2004-07-01 01:57:18
什么是最坏情况下?是将“987654321”排成“123456789的情况”??将逆序排成正序的情况?
有的文章说最少要n-1次,对吗?为什么?
它的证明如下:
证明:一:当未排序元素大于2时,每次交换都至少可以将一个元素放到它正确的位置上;当未排序元素等于2时,只要一次就可以把两个元素放到它正确的位置上。所以,最多需要n-1次。
二:若该序列为整数序列2,3,…,n,1。要将这个数列排序,必须把2到n共n-1个数往后移动。但是,每次交换只能将一个数字往后移动,所以至少需要n-1次交换才能完成排序。

第一步中:“每次交换都至少可以将一个元素放到它正确的位置上”是什么意思?
第二步中,怎么能用“若该序列为整数序列2,3,…,n,1”这样一个具体例子来证明 呢?证明要不失一般性!

你的观点呢?多谢指教
...全文
226 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2004-07-01
  • 打赏
  • 举报
回复
我是这么看楼主的问题的
就以楼主的例子来说明吧
是将“987654321”排成“123456789的情况”
看一下这个算法(最好的算法应该就是一次循环就排好序):
void main(void)
{
int a[10] = {9,8,7,6,5,4,3,2,1};
int max = a[0]; //第一个值
int temp;
for (int i=1; i<10; i++) //从下一个元素开始判断(即a[1]开始)
{
if (a[i] > max) //最坏的情况就是每次条件都成立
{
temp = max;
max = a[i];
a[i] = temp;
}
}
}
看到循环了吗?只用一个循环,而这个循环最坏的情况就是每次循环都进入if条件,而这个循环至少是n-1次,从1到9,i=10就退出循环了

第一步中:“每次交换都至少可以将一个元素放到它正确的位置上”是什么意思?
就是说每次交换完以后,其位置就是正确的
举个例子
5,3,2,4 如果按照上面的算法,第一次循环后,变成3,5,2,4 第二次循环后变成3,2,5,4 后面循环依次类推,可以看出,这样的话就不是位置正确了,因为2比3小,所以一个循环是不能排好顺序或需要改进该算法

第二步中,怎么能用“若该序列为整数序列2,3,…,n,1”这样一个具体例子来证明 呢?证明要不失一般性!
这个要这样来看的,作者只是举了个简单的例子,但是说服力我觉得也不强,主要是想说明即使是这样好的条件下(因为前面的顺序都排好了),最坏的情况也要至少比较n-1次

总的说来,就是说这样的排序算法,在最坏的情况下,(再好的算法)至少需要比较n-1次才能排序完成,不可能会比n-1次少的,不知道这样说你明白否?




hcj2002 2004-07-01
  • 打赏
  • 举报
回复
啊……
错了一个字
~~~汗

改正:

最坏的情况,不太好说清楚

比如说排序吧,就是说每次比较都需要交换数据,这就是最坏的情况。

hcj2002 2004-07-01
  • 打赏
  • 举报
回复
最坏的情况,不太好说清楚

比如说排序吧,就是说每次比较都学要交换数据,这就是最坏的情况。
oo 2004-07-01
  • 打赏
  • 举报
回复
最坏情况跟用的算法有关的。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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