当前位置: 首页 > news >正文

数据结构java版之冒泡排序及优化

冒泡排序的时间用大O表示法是O(N^2).

传统的冒泡排序:

/**
* @param total 要排序的数组长度
*/
public void sort(int total){
int num[];
if(total <= 0){
System.out.println("请输入大于0的正整数");
}else{
num = new int[total];
for (int i = 0 ; i < total; i++){
//生成随机1到100之间的数
Random ra =new Random();
num[i] = ra.nextInt(100)+1;
}
System.out.println("要排序的数组为:" + Arrays.toString(num));
int sum = 0;
int out,in;
for (out = total - 1; out > 1; out--){
for (in = 0 ; in < out; in++){
sum ++;
if(num[in] > num[in+1]){
int temp = num[in];
num[in] = num[in+1];
num[in+1] = temp;
}
}
}
// 最原始的冒泡排序
for(int i = 0; i < total -1 ; i ++){
for (int j = 0 ; j < total -1 ; j++){
sum ++;
if(num[j] > num[j+1]){
int temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
}
}
System.out.println("排序完成的数组为:" + Arrays.toString(num));
System.out.println("总共用次数:" + sum);
}
}

优化过后的冒泡排序:

/**
* @param total 要排序的数组长度
*/
public void sort(int total){
int num[];
if(total <= 0){
System.out.println("请输入大于0的正整数");
}else{
num = new int[total];
for (int i = 0 ; i < total; i++){
//生成随机1到100之间的数
Random ra =new Random();
num[i] = ra.nextInt(100)+1;
}
System.out.println("要排序的数组为:" + Arrays.toString(num));
/**核心算法:
* 双重循环,外层循环用于控制排多少次序。
* 内层循环从第一位开始一直往后比较,内层循环一次后,可以将最大的数至于末尾。
* 外层循环让内层循环继续排没有排序过的数组,排序过的不用再排。
*/
int sum = 0;
int out,in;
for (out = total - 1; out > 1; out--){
for (in = 0 ; in < out; in++){
sum ++;
if(num[in] > num[in+1]){
int temp = num[in];
num[in] = num[in+1];
num[in+1] = temp;
}
}
}

System.out.println("排序完成的数组为:" + Arrays.toString(num));
System.out.println("总共用次数:" + sum);
}
}

大家对比可以发现,就是外层循环的时候有点变化,其他的代码都是一模一样的。

那么优化后的算法能快多少呢。我们都以数组长度为10来计算:

传统冒泡排序:9x9=81步,

优化后的冒泡排序:9+8+7+6+5+4+3+2=44步。

因为优化后的冒泡排序,每排完一次,最后一个数已经是最大的,就不需要再比较了。

相关文章:

  • 洛谷1474货币系统——小心重复的完全背包
  • 博弈论入门之斐波那契博弈
  • 工程优化暨babel升级小记
  • poj 3280【区间dp】
  • iOS 9以上系统 信任的企业级开发者证书
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • volatile
  • 自定义主题
  • python爬微信公众号前10篇历史文章(1)-思路概览
  • windows server 2008R2 域控迁移到 windows server 2012域控
  • 自学web前端课程大纲分享,适合所有人学习
  • 每个 node 应用可能存在的 timing-attack 安全漏洞
  • 自己做的js甘特图插件
  • 流式计算与计算抽象化------《Designing Data-Intensive Applications》读书笔记15
  • codis proxy处理流程
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 2017届校招提前批面试回顾
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Django 博客开发教程 8 - 博客文章详情页
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JS函数式编程 数组部分风格 ES6版
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js中forEach回调同异步问题
  • React Native移动开发实战-3-实现页面间的数据传递
  • Spring框架之我见(三)——IOC、AOP
  • 技术发展面试
  • 简单易用的leetcode开发测试工具(npm)
  • 聊一聊前端的监控
  • 让你的分享飞起来——极光推出社会化分享组件
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • #pragma预处理命令
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (转)iOS字体
  • (转)编辑寄语:因为爱心,所以美丽
  • .cn根服务器被攻击之后
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net 设置默认首页
  • .Net接口调试与案例
  • .net实现客户区延伸至至非客户区
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • @ModelAttribute 注解
  • [ANT] 项目中应用ANT
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [c#基础]DataTable的Select方法
  • [C/C++]数据结构 栈和队列()
  • [datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
  • [HXPCTF 2021]includer‘s revenge
  • [iOS]-网络请求总结
  • [lesson17]对象的构造(上)