冒泡排序的疑问和随想

theMostValuablePers 2003-08-05 11:31:26
以下两例均是冒泡排序。
例一对等长的10个串排序,例二对不等长的串排序。例三是书里的示例。
问题:
1.我对冒泡的两个for循环不太理解,是否可以和我解释一下?那个循环到底是什么意思呢?
2.例一中第二个for循环是到j<=9-i而例二中则是j<=8-i我起先写例一时以为这样没问题运行也正常直到写例二时发现好像应该变成8-i才对。可为什么两个程序的运行都没有出错(溢出)?如果说例一中也应该是8-i,那程序为什么不会出错?而例二中改成8-i就会出错?
3.问题由第一问展开,例三中计数从1开始,现在我假设,计数从m开始,总共有n个数,那么形状犹如下面这种中间应该怎么填呢?
for(i=m;i<=____;i++)
for(j=m;j<=____;j++)

==================
-例一-------------
#include <stdio.h>
#include <string.h>

void print(char *ptStr[])
{
int i;
for (i=0;i<10;i++)
puts(ptStr[i]);
}

void sort (char *pString[])
{
char *ps;
int i,j;
for (i=0;i<=8;i++)/*10个串比较,冒泡排序*/
for(j=0;j<=10-i-1;j++)
if (strcmp(pString[j],pString[j+1])>0)
{
ps=pString[j];pString[j]=pString[j+1];pString[j+1]=ps;
}
}

void main()
{
char *pStr[10]={"China","Japan","Korea","Egypt","Nepal","Burma","Ghana","Sudan","Italy","Libya"};
puts("The 10 strings are:");
print(pStr);
sort (pStr);
puts("The sorted strings are:");
print(pStr);
}

-例二-----------

#include <stdio.h>
#include <string.h>

void print(char *ptStr[])
{
int i;
for (i=0;i<10;i++)
puts(ptStr[i]);
}

void sort (char *pString[])
{
char *ps;
int i,j;
for (i=0;i<=8;i++)/*10个串比较,冒泡排序*/
for(j=0;j<=8-i;j++)
if (strcmp(pString[j],pString[j+1])>0)
{
ps=pString[j];pString[j]=pString[j+1];pString[j+1]=ps;
}
}

void main()
{
int i;
char *pStr[10];
char arr[10][20];
for(i=0;i<10;i++)pStr[i]=arr[i];
puts("Input the string:");
for (i=0;i<10;i++)
gets(pStr[i]);
puts("The 10 strings are:");
print(pStr);
sort (pStr);
puts("The sorted strings are:");
print(pStr);
}

-例三--------------

#include <stdio.h>

void main()
{
int a[11];
int i,j,t;
printf("input 10 numbers:\n");
for (i=1;i<11;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=1;j<=9;j++)
for(i=1;i<10-j;i++)
if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("the sorted numbers:\n");
for(i=1;i<11;i++)
printf("%d",a[i]);
}
...全文
24 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfy 2003-08-07
  • 打赏
  • 举报
回复
对于数组最关心的是数组在循环中是否溢出,
xiaoyi20 2003-08-06
  • 打赏
  • 举报
回复
虽然我是菜鸟,但我还是建议自己动手。
我也是这样过来的,不然很容易忘记掉。
可以说所有的排序都要自己来一遍。
nicememory 2003-08-06
  • 打赏
  • 举报
回复
冒泡算法的原理很简单,实现也简单,你没能理解,我只能表示遗憾
frankzch 2003-08-06
  • 打赏
  • 举报
回复
我恨不得把你拽到我面前,我拿笔演示给你看!!!!!
想有更深刻的理解就要自己动手,想舒舒服服的让别人讲给你听就不要学了
mmmcd 2003-08-06
  • 打赏
  • 举报
回复
不要怕麻烦

大家都是这样混出来的。
loewe 2003-08-06
  • 打赏
  • 举报
回复
我最怕麻烦,看来我是没救了,55~~~~~~~~

算了算了,继续写程序去了~~`
starryC 2003-08-06
  • 打赏
  • 举报
回复
楼上的,你的昵称居然和我一个朋友的名字一摸一样,我刚开始还以为是他呢!
寻开心 2003-08-05
  • 打赏
  • 举报
回复

说来说去是没有理解冒泡的工作原理。
自己拿10张纸,一个上面写一个字符串,仿照上面的流程操作一遍就很清楚了。

冒泡的原理就是每次找出一定范围内最大或者最小的数据,把它放到队列的最前面或者最后面

外层循环控制的是排序的范围,内层则是在做范围内的最大/最小数据的移动。

寻开心 2003-08-05
  • 打赏
  • 举报
回复
从头说起吧。
给你一组数据,怎么把其中最大的找到,并且放在最后的位置?
有好几种办法,其中一种就是先拿出第一个数据,和第二个比,如果第一个比第二个大,就把第一个和第二个换一个位置;如果第二个比第一个大,就不动;这样到这里,就可以保证在数据当中第二个比第一个大,也就是说,在前两个数据当中,最大的放在了最后的位置。

然后把第二个和第三个比,如果第二个比第三个大,就把第二个和第三个换一个位置;如果第三个比第二个大就不动;这样到这里,就可以保证前三个数据当中最大的数放在了第三的位置。

这样一直重复到最后,就把最大的找到了并且放在了最后。


如果你理解了上面的说明,那么你就可以理解内层循环的作用了,内层循环就是找该范围内的最大的数,并且放在最后。

外层循环的作用就是,当你把最大的数找到并且放到最后的位置之后;再从去除最后一个(也就是整个数据当中最大的那个)之后,剩下的那些数据当中再找最大的,再放到最后;然后再缩小范围,再找最大的,依次类推,到了最后,数据就按照从小到大的顺序排列起来了。

先不要去管例子代码当中是如何写的,按照你自己的思路把这个东西写程序做一遍,成功后,然后回头看上边的例子,就会发现,只不过是把数据从后向前排,是按照次序把最小的放在最前面的思路进行的。最终的效果是一样——实现了数据的从小到大的排列,实现的方式有差别。

在开别人的程序的时候,很少有人能够对所有的事情都一目了然,这个时候就需要对不清楚的地方,自己动手按照别人的方法做一遍,才会体会其中的道理,不要怕麻烦
  • 打赏
  • 举报
回复
楼上两位,能不能就给我说一下啊,你们板块的人不会个个都这么高深吧,问个问题就是 自己去试一下,我要自己试的出来也不来这里混了!
frankzch 2003-08-05
  • 打赏
  • 举报
回复
1.第一个for循环决定冒多少次泡;第二个for循环决定一次冒泡的每一次比较
2.不用问,8-i是对的
3.理解了第一问这个就不要问了;告诉你答案对你没好处

33,008

社区成员

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

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