冒泡法原理及实现

冒泡法原理及实现冒泡法原理及实现 第一次接触排序算法 简单写一下实现原理 先看一道例题 用户输入十个数据 将数据从大到小输出 输入样例 1 30 23 56 0 199 23 45 78 200 输出样例 200 23 0 1 23 30 45 56 78 199 这里使用冒泡法 别的排序目前我也不太会 代码示例 include int main void

冒泡法原理及实现

第一次接触排序算法,简单写一下实现原理。
先看一道例题:
用户输入十个数据,将数据从大到小输出。
输入样例 1 30 23 56 0 199 -23 45 78 -200
输出样例 -200 -23 0 1 23 30 45 56 78 199
这里使用冒泡法。别的排序目前我也不太会
代码示例:

#include
int main(void)
{
int num[11];
int i,j;
int temp;
for(i=0;i<10;i++)
scanf("%d",&num[i]);
for(i=0;i<10-1;i++) //这里只需进行九次循环,第十次的数已经是最小值,不需要进行排序
for(j=0;j<10-1-i;j++) //这里只需进行n-i-1次排序,因为前i个数已经排好了序
if(num[j]>num[j+1])
{
temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
}
for(i=0;i<10;i++)
printf("%d ",num[i]);

return 0;
}

问题来了问什么叫冒泡

画了一个示意图,大概是这么个意思(观察过气泡在水中上升的同学可能比较明白,这个问题应该是和压力有关?!)


经过一次循环已经能看出一些端倪。最大数字经过一次循环已经放置到数组的最后一位,这里就不赘述后面的相似循环了,相信读者已经能根据第一次循环想到后面的情况了。
下面我们来详细分析一下代码:
for(i=0;i<10-1;i++)
第一个循环很简单,就是要循环n-1次,可能有人会问,为什么是n-1次?因为每次循环都会把当前循环中的最大一位放到右端,在第n-1次放完后,数组最左端的数字已经是最小的,不需要n次循环。
for(j=0;j<10-i-1;j++)
第二个循环也很简单,循环n-i-1次,为什么是n-i-1?同上,右端经过一次比较就会替换成最大值,每次循环放置一个当前循环的最大值,所以循环完全不必要进行10次,减去已经放好的值的数量(执行一次放一个,执行i次就是i个)可以提高程序运行的速度。
if(num[j]>num[j+1])
{

temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
}
第二个循环中嵌套了一个if条件用于实现程序的关键,交换。
如果前一个值大于后一个值,就交换他们,这里注意,不能直接换值,
num[j]=num[j+1];
num[j+1]=num[j];
虽然我相信很少人会犯这种低级错误。但是还是要解释一下这里换值的实现方式:
可以想象如下场景,A杯子装有可乐,B杯子装有雪碧,我们要交换为A杯子装雪碧,B杯子装可乐。直接换是不可能的,相信读者已经能想到了,在拿一个新杯子。让可乐先装在新杯子里,再把A杯子里装上B中的雪碧,这时B杯子已经空出来了,把新杯子里的可乐装到B杯子中,就能完成。
这里换值的操作完全与上面的情景相同,temp就是我们拿来的新杯子。
for(i=0;i<10;i++)
printf(“%d “,num[i]);
最后的循环负责打印结果,这个没什么好说的。

这里也可以考虑一下如何让程序降序排列。
2018/11/9创建
2018/12/9修改

编程小号
上一篇 2025-01-24 11:21
下一篇 2025-03-14 21:40

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/138086.html