交换类排序算法总结(代码+数据测试)

本文介绍了交换类排序算法中的冒泡排序和快速排序,包括算法原理、时间空间复杂度和稳定性分析。针对冒泡排序进行了优化,通过添加标志判断是否需要继续遍历。同时,讨论了快速排序的「双重夹击」策略,并提出了三数取中法优化枢轴选择,提高排序效率。实验表明,快速排序在大数据量下性能远超冒泡排序。

交换类的排序思想就是通过交换逆序元素进行排序的方法。冒泡排序通过相邻元素的交换消除逆序,而快排则通过不相邻的元素交换消除逆序,效率相对较高。接下来说说这两种排序算法,以及算法的优化。

1.冒泡排序算法:遍历整个待排序列,遍历过程当中顺次比较相邻两个元素的大小,如果逆序就交换,所以,每一躺遍历之后,最大(假设是升序)的元素一定在最后面,像是“冒泡泡”。代码(算法的实现细节都有标注释)如下:

// 冒泡排序算法
	public static void bubbleSort(int[] r) {
		// 定义一个标志,判断是否数据发生了交换动作
		int isChange = 0;
		// 外层循环控制的是排序的躺数
		for (int i = 0; i < r.length - 1; i++) {
			// 内层控制的是每趟排序中需要比较的次数
			for (int j = 0; j < r.length - 1 - i; j++) {
				// 如果当前元素大于它后面的一个元素,则将两者交换
				if (r[j] > r[j + 1]) {
					swap(r, j, j + 1);
					// 交换之后将isChange置为1,表示元素发生过交换
					isChange = 1;
				}
			}
			// 这一趟循环结束后,如果isChange=0,则说明数组已经有序了
			// 直接跳出循环,以免发生不必要的比较与交换
			if (isChange == 0)
				break;
		}
	}

这个是做了小优化的冒泡排序算法,定义了一个标志isChange,如果待排序列本身就是有序的话其实是不会发生元素交换的,也就是说,如果遍历了一遍发现没有交换,就及时跳出循环,不用跑下一趟,此时是冒泡排序最好的情况,时间复杂度为O(n)。

与之相对的最坏情况下(完全逆序)时间复杂度就是O(n^2)啦!

由于该算法在排序过程中没有使用额外空间,空间复杂度自然为O(1)啦!

稳定性呢?当然稳定了,该算法从前往后进行,大于后面的才交换,相同的元素是没有必要交换的。

数据测试:

数据规模

1000

10000

100000

时间/s

0.024454538

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值