冒泡排序简单来说就是在一组数据中,从左到右,俩俩比较,然后把较大的数据往前推,一轮下来之后,最大的一个数据就被推到了最右边。
基本原理
每轮从第一个元素开始,相邻两元素之间比较大小,交换元素彼此的位置,直到最后一对相邻元素
总共进行n-1轮
每轮进行n-i-1次比较(这是从下标为0开始的,如果是从下标为1开始,则每轮进行n-i次比较)
有如下数组(int[] arr = new int[]{3,9,-1,1-,20)假设我们要实现数组从小到大排序,
排序过程如下
代码实现
1、不用i表示轮数
int [] arr = new int[]{3,9,-1,10,20};
//外循环控制轮数
for(int i = 0; i<arr.length-1; i++){
//内循环控制比较次数
for(int j = 0; j<arr.length - i-1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
2、假设用i同时表示轮数
int [] arr = new int[]{3,9,-1,10,20};
//外循环控制轮数
for(int i = 1; i<arr.length; i++){
//内循环控制比较次数
for(int j = 0; j<arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
冒泡排序优化
因为排序过程中,个元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明列有序,因此可以在排序过程中设置一个标志位flag来判断元素是否进行过交换,从而减少不必要的比较。
具体实现如下:
int temp = 0;
boolean flag = false; //标记位,true表示交换过,false表示未交换过
for(int i = 1; i<arr.length; i++){
for(int j = 0; j<arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = true;
}
}
System.out.println("第" + (i + 1) + "趟排序后的数组");
System.out.println(Arrays.toString(arr));
if(!flag){
break;
}else{
flag = false;
}
}