对一组数据进行升序排序。
分析:
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(nn);
3、所以冒泡排序的平均时间复杂度为O(n*n);