排序系列之冒泡排序三种形式

希望大家用心去读,内容不多,相信会对你有帮助

最原始冒泡

说明:一数组的乱序数列,两两相比较,大的放右边,每一轮比较将最大的一个数确定在数组尾部,并且每一轮比较后总的比较次数减一,依次循环。

举个栗子:
第一轮确定第一个最大的
第一轮确定第一个最大的再确定第二个最大的
在这里插入图片描述再确定第三、第四。。。个最大的
在这里插入图片描述
上模板:

for(int end = array.length - 1;end > 0;end --){ // array.length数组长度
	for(int begin = 1;begin <= end;begin ++){ // 注意这里begin是从1开始的
		if(array[begin] < array[begin-1]){ // 如果右边的小于左边的,交换
			int tmp = array[begin];
			array[begin] = array[begin-1];
			array[begin-1] = tmp;
		}
	}
}

改进冒泡


说明:如果一个乱序数组,在排序过程中,后面的数组尾部的数值逐个被确定,突然发现,前面的多个数值已经是有序的了,如果这样就不用排了,直接结束即可,减少了语句执行次数

举个梨子:
如图前三个数是有序的,这样先排好后两个
在这里插入图片描述
之后,当进行下一轮循环时,发现该循环中没有任何数值的交换(因为1、2、3已经有序了),故直接结束战斗
在这里插入图片描述

上模板:

forint end = array.length -1;end > 0;end --{
	boolean sorted = true; // 用来标记是不是前面的是有序的
	for(int begin = 1;begin <= end;begin ++){
		if(array[begin] < array[begin-1]){
			int tmp = array[begin];
			array[begin] = array[begin-1];
			array[begin-1] = tmp;
			sorted = false;
		}
	}
	if(sorted) break; //如果执行,说明上一轮循环中if语句没有执行,说明没有交换,从而说明此时前面的序列已经是有序的了
}

再次改进冒泡

说明:上一次改进是排序过程中,可能前面是有序的,这次分析一下后面如果有一部分一上来就是有序的呢?其实道理差不多,这里就是,后面如果多个数已经有序了,则直接把后面这些有序的最前面的那个数,作为分界点,继续对整个数组从下标0到分界点进行排序


举个李子:
如图,4、5、6、7都是有序的,4和5、5和6、6和7,两两之间都没有进行交换,再往前看,3和4是最后一次交换的在这一轮中,故记录下4,下一轮从0-4进行排序,后面的不在考虑

在这里插入图片描述
之后对1-4分析,其实还有些情况,可能1-4中的后面几个又是有序的,则再次标记,减小范围
在这里插入图片描述上模板:

forint end = array.length - 1;end > 0;end --{
	int sortedIndex = end; // 这里注意如果赋值为1 0 -1...则当所排序列是本身就是有序的,内层循环只需走一轮便会跳出,结束
	for(int begin = 1;begin <= end;begin ++){
		if(array[begin] < array[begin-1]){
			int tmp = array[begin];
			array[begin] = array[begin-1];
			array[brgin-1] = tmp;
			sortedIndex = begin; // 获取本轮循环中最后一次使用的begin
		}
	}
	end = sortedIndex;
}

贵在坚持,难在坚持,成在坚持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rabbit Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值