Hark的数据结构与算法练习之冒泡排序

算法说明:

冒泡排序实际上是使用的最多的排序,逻辑是循环然后对相邻的数字进行比较,并交换数据。

例如有一个数组int[] arrayData = { 2, 3, 1, 5, 6, 7, 4, 65, 42 },一共9个元素。

假设我们要做降序排序,那么首先全部9个元素从第1个元素开始进行两两比较,把小的元素放到后边;元素1小于元素2,那么元素1与元素2进行交换,然后元素2与元素3进行比较,元素2大于元素3,那么不进行交换,再进行元素3与元素4的比较…………以此类推最后比较到元素9。 这时元素9已经存在的是最小的数字啦。 接着我们继续比较前8个元素,再把最小的数字移动到元素8中。 然后前7个元素两两比较,前6个,前5个……以此类推,最后得出结果。

算法复杂度:

O(n2)

空间复杂度:

O(1)

代码:

使用语言:Java

/*
 * 冒泡排序
 */
public class BubbleSort {
	public static void main(String[] args) {
		int[] arrayData = { 2, 3, 1, 5, 6, 7, 4, 65, 42 };
		int temp = 0;
		for (int i = 0; i < arrayData.length; i++) {
			for (int j = 1; j < arrayData.length - i; j++) {
				if (arrayData[j] > arrayData[j - 1]) {
					temp = arrayData[j];
					arrayData[j] = arrayData[j - 1];
					arrayData[j - 1] = temp;
				}
			}
		}

		for (int integer : arrayData) {
			System.out.print(integer);
			System.out.print(" ");
		}
	}
}

结果是:

65 42 7 6 5 4 3 2 1 

论证算法复杂度:因为是双层循环,所以最坏算法复杂度是O(n2)。

论证空间复杂度:因为作为临时空间进行数据交换只有一个temp变量,所以空间复杂度是O(1)

时间: 2024-08-27 10:23:31

Hark的数据结构与算法练习之冒泡排序的相关文章

JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把冒泡排序.选择排序.插入排序放在一起比较,是因为它们的平均时间复杂度都为 O(n2). 请大家带着问题:为什么插入排序比冒泡排序更受欢迎 ?来阅读下文. 2. 如何分析一个排序算法 复杂度分析是整个算法学习的精髓. 时间复杂度: 一个算法执行所耗费的时间. 空间复杂度:

数据结构和算法-002 数组排序 冒泡排序

冒泡排序 1算法原理 1. 冒泡排序算法的运作如下:(从后往前) 2. 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 3. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 4. 针对所有的元素重复以上的步骤,除了最后一个. 5. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 2算法分析 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 和记录移动次数  均达到最小值: ,. 所

Hark的数据结构与算法练习之鸡尾酒排序

算法说明 鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序. 鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种.冒泡是从低向高比较排序,鸡尾酒从低向高,从高向低交换着进行排序.大家看一下代码就知道了. 某些特殊有序数组情况下,鸡尾酒排序是效率略好于冒泡排序,例如: int[] arrayData = { 2, 3, 4, 5, 6, 7, 8, 9, 1 }; 鸡尾酒排序只排序一次就能出结果,而冒泡排序就需要8次才能出结果. 代码 使用的是java

Hark的数据结构与算法练习之地精(侏儒)排序

算法说明 地精排序是交换排序的一种,它是冒泡排序的一种改良,我感觉和鸡尾酒排序挺像的. 不同之处是鸡尾酒排序是从小到大,然后再从大到小切换着排序的.而地精排序是上来先从小到大排序,碰到交换到再从大到小,接着再从小到大进行排序. 举个例子: 对8,6,4,5,1进行升序排序 1.8与6交换,结果是 {6,8,4,5,1} 2.8与4交换,结果是 {6,4,8,5,1} 3.4与6交换,结果是 {4,6,8,5,1} 4.5与8交换,结果是 {4,6,5,8,1} 5.6与5交换,结果是 {4,5,

【数据结构与算法 01】冒泡排序

算法思想: 一共进行 array.size-1趟排序,每一趟排序,都将左右两个数进行比较大小,并且交换位置,这样的效果是:每一趟排序中,能找到最大的值冒泡到该趟排序的最后面,这样的话,第一趟排序,最后一个数是最大的,第二趟排序,倒数第二个数就是第二大的,最后一趟排序后 (因为最后一趟只有一个数,不用比较,所以比较次数是 array.size-1 趟),将得到有序数组 博客地址:http://blog.csdn.net/mkrcpp/article/details/39178213 import

Hark的数据结构与算法练习之奇偶排序

算法说明 奇偶排序又叫奇偶换位排序,砖排序.它是一种交换排序,也是冒泡的一个变种 顾名思义,奇偶排序,其实就是先循环奇数位,然后将奇数位与偶数位比较计算. 然后再循环偶数位,再和奇数位比较运算.看一下代码大家就明白了. 据wiki所述,这种算法是一种并行算法,个人对这块现在不太理解,没明白这块所谓的并行是什么意思,现在只是完成了一个单机版,将来如果明白了再过来进行补充啦. 代码 使用的是java package hark.sort.exchangesort; /* * 奇偶排序 */ publi

Hark的数据结构与算法练习之Bogo排序

算法说明 Bogo排序是交换排序的一种,它是一种随机排序,也是一种没有使用意义的排序,同样也是一种我觉得很好玩的排序. 举个形象的例子,你手头有一副乱序的扑克牌,然后往天上不停的扔,那么有一定机率会变成有序的. 哈哈,就是这样. 看一下代码大家就知道了. 代码 使用的是java package hark.sort.exchangesort; import java.util.Random; /* * Bogo排序 */ public class BogoSort { public static

Hark的数据结构与算法练习之煎饼排序

算法说明 假设煎锅里边有N个煎饼摞在了一起,它们大小不一并且顺序不一致,我们需要通过拿铲子将它们不停的翻个,进行排序,最终得到一个底下是大的煎饼,上边是小的煎饼的序列.这个排序的过程就是煎饼排序. 这个算法有两种解,一种是普通解,一种是最优解. 普通论证: 例如你的初始煎饼顺序是[2,4,3,1] 然后2与4交换位置,然后4与1交换位置,得出[1,3,2,4]. 然后3与1交换位置,接着3与2交换位置,得出[2,1,3,4]. 最后2与1交换位置,得出结果[1,2,3,4] 通过普通解的过程,我

Hark的数据结构与算法练习之图书馆排序

算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移.而图书馆排序的思路就是将每个元素后边都预留N个空间(例如预留10个元素空间),这样往某个元素前插入时,在预留空间足够的前题下,只会移动少少几个的元素. 代码 因为4月要考试,所以代码暂不写,以后有时间时补上 参考 http://www.cnblogs.com/kkun/archive/2011/1