冒泡排序

对一组数据进行升序排序。
分析:
1、创建数组,输入数据。
2、利用循环,从头到尾一次比较相邻的两个元素大小关系,若大于则交换位置,经过第一轮可得出最大值,然后使用同样的方法把剩下的元素逐个进行比较;
注意事项:
A、n个元素一共需要进行n-1轮比较
B、因为每比较一次都会确定一个最大值,所以每轮比较后需要比较的次数会逐步递减。
如6个元素需要进行6-1次比较,第一轮比较5次,第二轮比较4次,第四轮需要比较2次

//利用双重循环进行遍历数组和循环比较
int [] array={2,3,5,34,6,13,33,7};
for(int i=0;i<array.length-1;i++){	//一共进行length-1轮
	for(int j=0;j<arr.length-1-i;j++){	//每进行一轮都会确定一个次大数。对应比较的次数减少
		if(array[j]>array[j+1]){
		//将较大值和较小值进行为位置交换
		int temp=array[j];
		array[j]=array[j+1];
		array[j+1]=temp;
		}
	}
}

**关于冒泡排序的优化问题,实际排序中可能在还未完全循环完时数据已经排序完成,比如1923456只需要进行一轮排序就会完成排序,这时为了减小优化时间,提高效率,可以通过设置一个布尔变量来监控是否交换完成。

	int [] array= {2,3,5,34,6,13,33,7 };
	System.out.println("排序前:"+Arrays.toString(array));
	 for(int i=0;i<array.length-1;i++) {
			boolean flag=true;//监控标记
			System.out.println("第"+(i+1)+"次排序:");//记录每一次循环的结果
			//第五次排序实际完成。如果在排序完成后结束当前操作
			for(int j=0;j<array.length-1-i;j++) {
			 if(array[j]>array[j+1]) {
				 int temp=array[j];
				 array[j]=array[j+1];
				 array[j+1]=temp;
				 flag=false;
				 }
			 System.out.println(Arrays.toString(array));//记录每一次循环的结果
			 if(flag) {//对监控进行标记,如果为true,则表示结束循环。
				 System.out.println("排序完成!");
				 break;
				 }
			 } 
		 }
   
  //输出结果
  System.out.println(Arrays.toString(array));

最后,关于冒泡排序的复杂度的理解。
1、排序状态最好的时候。
初始时便是正序,只需扫描一次便结束排序。比较次数为C,记录移动次数为M均达到最小值。
Cmin=n-1;Mmin=0;
所以冒泡排序最好的时间复杂度为O(n).

2、排序状态最差的时候。
初始时为反序,一共要进行n-1趟排序,每次要进行n-1-i次数据的比较,(1<=i<=n-1),比较和移动次数都达到最大值,
Cmax=n(n-1)/2=O(nn);
Mmax=3n(n-1)/2=O(n
n);

3、所以冒泡排序的平均时间复杂度为O(n*n);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值