冒泡排序总结

2023-05-16

本文内容和代码均来自于《漫画算法》,小灰和大黄的对话,非常有趣味的一本书。现理论结合实践,做一下测试。

private static final int LEN = 20000;

	// 第一版
	void bubbleV1(int[] arr) {
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = 0; j < arr.length - 1 - i; j++) {
				int temp = 0;
				if (arr[j] > arr[j + 1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}

			}
			log("第" + (i + 1) + "轮");
			log(Arrays.toString(arr));
		}
	}

	/**
	 * 第一版如果元素经过小于arr.length-1轮比较已经变的有序,依然会进行剩下的轮数比较,
	 * 为了克服这个缺点,增加一个判断数组是否已经有序的boolean变量。 第二版
	 * 
	 * @param arr
	 */
	void bubbleV2(int[] arr) {
		for (int i = 0; i < arr.length - 1; i++) {
			boolean isSorted = true;
			for (int j = 0; j < arr.length - 1 - i; j++) {
				int temp = 0;
				log("compare " + arr[j] + " with " + arr[j + 1]);
				if (arr[j] > arr[j + 1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					isSorted = false;
				}

			}
			if (isSorted) {
				break;
			}
			log("第" + (i + 1) + "轮");
			log(Arrays.toString(arr));
		}
	}

	/**
	 * 第三版 [3,2,1,4,5,6,7,8] [2,1,3,4,5,6,7,8] [1,2,3,4,5,6,7,8]
	 * 假如这样的初始数组,从4开始的元素已经是有序的了,但是还是白白的比较了许多次。 是一个需要优化的点。 这个问题的关键点在于对数组中有序区的界定。
	 * 按照现有逻辑,有序区的长度和,排序的轮数是相等的。如第一轮排序过后的有序区长度是1, 第二轮排序过后的有序区长度是2......
	 * 实际上有序区的长度可能大于这个长度,上述例子中,在第二轮排序时,后面的5个元素已经属于有序区了。 因此后面的多次元素比较是没有意义的。
	 * 避免方法:在每一轮排序后,记录下最后一次元素交换的位置,该位置即为无需数列的边界,再往后就是有序区了。
	 * 
	 * @param arr
	 */
	void bubbleV3(int[] arr) {
		int lastExchangedIndex = 0;
		int sortBorder = arr.length - 1;
		for (int i = 0; i < arr.length - 1; i++) {
			boolean isSorted = true;
			for (int j = 0; j < sortBorder; j++) {
				int temp = 0;
				log("compare " + arr[j] + " with " + arr[j + 1]);
				if (arr[j] > arr[j + 1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					isSorted = false;
					lastExchangedIndex = j;
				}

			}
			sortBorder = lastExchangedIndex;
			log("border:" + sortBorder);
			if (isSorted) {
				break;
			}
			log("第" + (i + 1) + "轮");
			log(Arrays.toString(arr));
		}
	}

	/**
	 * 第四版(鸡尾酒排序) [2,3,4,5,6,7,8,1] 如上例子,前面三种版本排序方法需要排7轮,然而大部分的数据都是有序的。
	 * 为了克服这个缺点。
	 * 
	 * @param arr
	 */
	void bubbleV4(int[] arr) {
		int temp = 0;
		for (int i = 0; i < arr.length / 2; i++) {
			// 有序标记,每一轮初始值都是true
			boolean isSorted = true;
			// 奇数轮,从左往右比较和交换
			for (int j = i; j < arr.length - 1 - i; j++) {
				log("compare " + arr[j] + " with " + arr[j + 1]);
				if (arr[j] > arr[j + 1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					isSorted = false;
				}

			}
			if (isSorted) {
				break;
			}
			log("第" + (i + 1) + "轮");
			log(Arrays.toString(arr));

			// 偶数轮,从右往左比较和交换
			isSorted = true;
			for (int k = arr.length - 1 - i; k > i; k--) {
				if (arr[k] < arr[k - 1]) {
					temp = arr[k];
					arr[k] = arr[k - 1];
					arr[k - 1] = temp;
					isSorted = false;
				}
			}
			if (isSorted) {
				break;
			}
			log("第" + (i + 2) + "轮");
			log(Arrays.toString(arr));
		}
	}

	@Test
	public void test() {
		// int[] arr={3,2,1,4,5,6,7,8};
		int[] arr = { 2, 3, 4, 5, 6, 7, 8, 1 };
		// int[] arr={5,8,6,3,9,2,1,7};
		// int[] arr={25, 58, 29, 3, 21, 3, 60, 46, 79, 15};
		// bubbleV1(arr);
		// bubbleV2(arr);
		// bubbleV3(arr);
		bubbleV4(arr);
		log(Arrays.toString(arr));

	}

	@Test
	public void test2() {
		int[] arr2 = new int[LEN];
		Random random = new Random();
		for (int i = 0; i < LEN; i++) {
			arr2[i] = random.nextInt(100);
		}
		// log(Arrays.toString(arr2));

		long begin, end;

		begin = System.currentTimeMillis();
		bubbleV1(arr2);
		end = System.currentTimeMillis();
		System.out.println(end - begin);

		begin = System.currentTimeMillis();
		bubbleV2(arr2);
		end = System.currentTimeMillis();
		System.out.println(end - begin);

		begin = System.currentTimeMillis();
		bubbleV3(arr2);
		end = System.currentTimeMillis();
		System.out.println(end - begin);

		begin = System.currentTimeMillis();
		bubbleV4(arr2);
		end = System.currentTimeMillis();
		System.out.println(end - begin);

	}

	void log(String x) {
		if (false) {
			System.out.println(x);
		}
	}

分别用1万个元素和2万个整型数据做测试,结果如下

方法版本数组长度(万)耗时(ms)
112833
213
312
412
1210475
224
323
423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

冒泡排序总结 的相关文章

  • Windows配置Redmine运行环境

    上一篇记录的是 在Linux Ubuntu 上配置Redmine运行环境 xff0c 这次记录一下在Windows上配置的过程 配置过程总体很相似 xff0c 只是稍微有一点点差别 其实在Windows上配置 完全是个巧合 xff0c 在我
  • 【Android】使用Assets目录中的图片资源

    ImageView 中有个setImageBitmap的方法 xff0c 可以将Bitmap类直接设置为使用的图片资源 span class token comment 设置图片 span span class token comment
  • 分享一下我参加开发者大会以来自己的总结(仅供参考)

    手机游戏设计 1选材类型符合移动平台特性 2剧情背景知名度高 3选材定义自己的用户 xff0c 用户觉得游戏的玩法 游戏设计法则 xff08 无需全部实现 xff0c 根据自己游戏类型找和适合法则结合 xff09 法则 1 xff1a 富有
  • redisson 布隆过滤器(校验唯一性)

    一 需求背景 项目中需要保证订单号唯一性 xff0c 保证准确率和速度的前提下 xff0c 可以使用redis的redisson布隆过滤器来实现 缺点 xff1a 存在误判率 使用时跟产品经理确认是否允许出现误判的情况 二 实战代码 1 开
  • 笑谈Android图表------MPAndroidChart

    MPAndroidChart是一款基于Android的开源图表库 xff0c MPAndroidChart不仅可以在Android设备上绘制各种统计图表 xff0c 而且可以对图表进行拖动和缩放操作 xff0c 应用起来非常灵活 MPAnd
  • 详谈高大上的图片加载框架Glide -应用篇

    在Android设备上 xff0c 加载网络图片一直是一个头疼的问题 xff0c 因为Android设备种类繁多 xff08 当然最主要的是配置 xff09 xff0c 处理的稍不周到轻则应用卡顿 xff0c 严重者就会出现OOM的 xff
  • 微信小程序开发环境搭建

    微信小程序可谓是今天最火的一个名词了 xff0c 一经出现真是轰炸了整个开发人员 xff0c 当然很多App开发人员有了一个担心 xff0c 微信小程序的到来会不会给移动端App带来一个寒冬 xff0c 身为一个Android开发者我是不相
  • 实现APP定位功能

    源码传送门 若你不小心点击进入GitHub了捎带给个star 前言 最近更新项目中用的百度定位SDK时遇见了一个奇葩的问题 当升级SDK后百度定位一直返回505 通过百度定位官网查看该码表示AK非法或者不存在 很纠结 于是自己又写了一个de
  • Java利器之UML类图详解

    前言 UML xff08 Unified Modeling Language xff09 中文统一建模语言 xff0c 是一种开放的方法 xff0c 用于说明 可视化 构建和编写一个正在开发的 面向对象的 软件密集系统的制品的开放方法 UM
  • 从零开始学习Linux部署Java web项目

    前言 最近越来越发现需要学习的东西太多了 xff0c 前几天公司服务器出现问题 xff0c 需要对服务器硬件进行维护 xff0c 当然服务器上的服务需要部署到另一个服务器上 这对于我来说是很陌生的 xff0c 虽然这件工作没有让我去做 xf
  • 微信小程序分页加载

    分页加载功能大家遇到的应该会经常遇到 xff0c 应用场景也很多 xff0c 例如微博 xff0c QQ xff0c 微信朋友圈以及新闻类应用 xff0c 都会有分页加载的功能 xff0c 这不仅节省了我们用户的流量 xff0c 还提升了用
  • ReactNative ViewPageAndroid组件详解

    源码传送门 在我们开发Android的时候 xff0c ViewPage这个控件的使用频率还是很高的 xff0c 最简单的就是制作引导页 xff0c 应用程序的主界面等 xff0c 在ReactNative开发中实现该功能的组件是ViewP
  • Android自定义数字键盘

    好久没有写Android的文章了 xff0c 有两三个月多了吧 xff0c 刚开始搞微信小程序 xff0c 后来又开搞ReactNative 现在又兴奋的开搞AI机器学习的东西 xff0c 感觉挺有意思的 xff0c 不过AI与其它的东西相
  • ConstraintLayout基础介绍

    自去年Google I O 大会发布ConstraintLayout至今 xff0c 已有一年多的时间 xff0c 但是并没有普及开来 xff0c 了解过ConstraintLayout布局的人知道 xff0c 它的性能的确提升了不少 在前
  • Gson转换报错com.google.gson.JsonSyntaxException

    转载请标明出处 xff1a http blog csdn net xiejinquan article details 52002196 Gson将jsonobject的字符转化为Bean类或者将jsonarray的字符串转化为List l
  • MTK6580调试IMX132流程分析

    MTK6580调试IMX132流程分析 一开始不了解 MTK 的点亮流程 怎么办呢 1 MTK 开机是 首先是 CameraService 先起来 然后就通过获取 HAL 中的 sensorList 中的信息 CameraManager与C
  • 双线性插值算法

    图像的缩放很好理解 就是图像的放大和缩小 传统的绘画工具中 有一种叫做 放大尺 的绘画工具 xff0c 画家常用它来放大图画 当然 xff0c 在计算机上 xff0c 我们不再需要用放大尺去放大或缩小图像了 xff0c 把这个工作交给程序来
  • JAVA字符串判空的方法

    1 记录自己工作中的问题 xff1a 针对某些字符串进行判空时 xff0c 出现的BUG StringUtils hasText StringUtils hasText null 61 false StringUtils hasText 3
  • 出现次数最多的小写字母

    出现次数最多的小写字母 题目描述 输入一个由小写字母组成的字符串 xff08 字符数量 lt 61 100 xff09 xff0c 输出出现次数最多的小写字母 注意 xff1a 如果有多个小写字母出现的次数一样多 xff0c 则输出ASCI
  • EFCore 从入门到精通-6(详谈查询)

    目录 1 初始准备1 1 工具准备1 2 程序准备1 3 准备数据 2 基础回顾以及探寻2 1 单个查询2 2 查询所有的数据 2 3 筛选和过滤查询2 4 探究原理 3 客户端评估和服务端评估3 1 IEnumerable And IQu

随机推荐

  • 【Android解决方案】在onResume里调用getIntent()得到的是上一次数据

    我有四个媒体分类 xff08 Record xff0c Music xff0c Video xff0c Picture xff09 xff0c 里面除了数据不同 xff0c 界面都是相似的 xff0c 所以我把它们用一个MediaActiv
  • pycharm运行停止快捷键

    运行 shift 43 f10 停止 ctrl 43 f2
  • RecyclerView预加载

    private boolean isLoadingMore 61 false 是否预加载 recyclerView addOnScrollListener new RecyclerView OnScrollListener 64 Overr
  • 自定义右侧弹出dialog并填充状态栏

    DialogUtil xff1a public class DialogUtil private Dialog dialog private View inflate public void showRightDialog Context
  • Android监听横竖屏切换

    偶然在项目中用到播放视频时 xff0c 需要横屏将视频全屏播放 xff0c 所以需要监听屏幕的横竖屏切换事件 ConfigChanges xff0c 用于捕获手机状态的改变 xff0c 当横竖屏切换 xff0c 屏幕尺寸变化 xff0c 弹
  • SVN利用 AS 进行代码对比的方法

    第 1 种 xff1a 如果我们是从 SVN 检出的项目 xff0c 并且想比较本地代码与从 SVN 检出时的代码相比都有那些区别 xff0c 可以按如下步骤操作 如上图所示 xff0c 在代码编辑区 xff0c 右键唤出功能菜单 xff0
  • ADB操作命令详解大全

    ADB 操作命令详解及用法大全 Lucas liu的博客 CSDN博客
  • Android Studio build下面找不见assembleDebug选项解决办法

    在开发Android的AAR库时 xff0c 习惯点击右侧gradle面板的Task任务进行编译 xff0c 如选择assembleDebug或assembleRelease进行编译 xff0c 如下 xff1a 说明 xff1a 其中as
  • android 注销到登陆界面实现

    code class java span class hljs keyword public span span class hljs class span class hljs keyword class span span class
  • 中兴2016校招软件在线笔试题

    面试经验可以参考我的另一篇文章 xff0c 是7月初参加openday面试的 xff0c 文章链接http blog csdn net dandelion1314 article details 47009585 招聘群里有人发的招聘时间安
  • 设置AndroidStudio左侧和右侧的字体

    1 File Settings Appearance amp Behavior Appearance xff0c 右边Override default fonts by not recommended 2 设置代码大小 xff1a File
  • Android下载网络资源文件

    直接上代码 xff1a lt uses permission android name 61 34 android permission WRITE EXTERNAL STORAGE 34 gt lt uses permission and
  • 出现:trying to draw too large(138078000bytes) bitmap:错误时

    这里就不翻译了 xff0c 意思就是说你将高分辨率图片放在了低分辨率文件夹下 例如 xff1a 图片的分辨率是属于xxhdpi的 xff0c 而你将这张图片放在了drawable xhdpi或者比这个还低的文件夹下 xff0c 就会报这个错
  • Android把图片压缩到一定大小并不失真

    本文转载只供参考 一 图片压缩方式 图片按比例大小压缩方法 64 param srcPath xff08 根据路径获取图片并压缩 xff09 64 return public static Bitmap getimage String sr
  • Android 动态设置TextView的位置

    RelativeLayout LayoutParams layoutParams 61 new RelativeLayout LayoutParams 40 40 宽高 layoutParams setMargins int dstX 20
  • 神经网络应用较多的算法,图卷积神经网络应用

    神经网络原理及应用 神经网络原理及应用1 什么是神经网络 xff1f 神经网络是一种模拟动物神经网络行为特征 xff0c 进行分布式并行信息处理的算法 这种网络依靠系统的复杂程度 xff0c 通过调整内部大量节点之间相互连接的关系 xff0
  • Java泛型学习

    纯属个人理解 xff0c 代码参考自视频 用途 xff1a 1 用于集合容器中 xff0c 可以使集合记住存储数据的类型 xff0c 防止频繁转换类型可能导致的ClassCastException 用于javac编译器的类型检查 xff0c
  • Java反射学习

    文字和代码来源于视频 反射 xff0c 通过它我们可以得到一个Java类的全部信息 xff0c 可以调用类的普通方法 xff0c 构造方法 xff0c 对类进行实例化 xff0c 操作类的属性 类中的所有内容 xff1a 属性 构造方法 普
  • 面试题之反转单向链表

    题目为 xff1a 将一个单向链表反转 xff0c 写出算法步骤或代码 懵批了 今学习如下 xff0c 文章代码参考https blog csdn net K346K346 article details 93371829 xff0c 感谢
  • 冒泡排序总结

    本文内容和代码均来自于 漫画算法 xff0c 小灰和大黄的对话 xff0c 非常有趣味的一本书 现理论结合实践 xff0c 做一下测试 span class token keyword private span span class tok