冒泡法原理及实现
冒泡法原理及实现
第一次接触排序算法,简单写一下实现原理。
先看一道例题:
用户输入十个数据,将数据从大到小输出。
输入样例 1 30 23 56 0 199 -23 45 78 -200
输出样例 -200 -23 0 1 23 30 45 56 78 199
这里使用冒泡法。别的排序目前我也不太会
代码示例:
#include<stdio.h>
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修改
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180260.html原文链接:https://javaforall.cn
相关文章
- "CAUSE"包解决孟德尔随机化的水平多效性---原理介绍
- Java服务器热部署的实现原理
- 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理
- 协同过滤推荐算法(一)原理与实现
- 光流法原理概述「建议收藏」
- 精读《Headless 组件用法与原理》
- Golang(十)TLS 相关知识(一)基本概念原理
- Vue响应式系统原理并实现一个双向绑定
- Webpack插件核心原理
- redis过期时间实现原理_redis过期时间实现原理
- vue-router实现路由懒加载( 动态加载路由 )_前端懒加载原理
- Mysql事务实现原理整理
- 从源码角度看React-Hydrate原理
- RocketMQ消息过滤实现原理
- 一文读懂 Xcode 代码索引原理
- 表格集算表高性能原理——怎样实现纯前端百万行数据秒级响应
- BIO 和 NIO 的区别和原理
- 大数据Canal(四):Canal HA原理及安装
- etcd集群原理,部署文档
- Go-Channel的使用和底层原理(上)
- Redis核心原理与实践之字符串实现原理
- 深入理解redis_memcached失效原理(小结)
- [android] 异步http框架与实现原理详解手机开发
- 详解Java GC的工作原理+Minor GC、FullGC编程语言
- Oracle左联查询实现原理及应用(oracle左联)
- Oracle 数据库技术:探究其原理运用(oracle原理)
- Oracle游标及其原理深入剖析(oracle游标原理)
- Redis实现验证码保护原理分析(redis验证码原理)
- .Net中如何操作IIS的虚拟目录原理分析及实现方案
- 关于在MFC中将窗口最小化到托盘实现原理及操作步骤
- JavaScript如何控制Session实现原理及代码
- 纯js实现遮罩层效果原理分析