当前位置: 首页 > 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处理流程
  • php的引用
  • 【React系列】如何构建React应用程序
  • Angular Elements 及其运作原理
  • Git同步原始仓库到Fork仓库中
  • iOS小技巧之UIImagePickerController实现头像选择
  • k8s如何管理Pod
  • Laravel5.4 Queues队列学习
  • Linux gpio口使用方法
  • Linux链接文件
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PHP CLI应用的调试原理
  • python学习笔记 - ThreadLocal
  • Solarized Scheme
  • swift基础之_对象 实例方法 对象方法。
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 关于springcloud Gateway中的限流
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 如何编写一个可升级的智能合约
  • 深度学习在携程攻略社区的应用
  • 使用 @font-face
  • 说说动画卡顿的解决方案
  • 一些css基础学习笔记
  • 【云吞铺子】性能抖动剖析(二)
  • 积累各种好的链接
  • ​学习一下,什么是预包装食品?​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • $GOPATH/go.mod exists but should not goland
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (poj1.2.1)1970(筛选法模拟)
  • (windows2012共享文件夹和防火墙设置
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十)T检验-第一部分
  • (转)setTimeout 和 setInterval 的区别
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 反射的使用