基本思想
将需要进行排序的算法进行遍历,在遍历过程中比较相邻两个元素的大小,根据实际需要降序或升序排序进行大小判断,这里以升序为例。当相邻两个元素前一个比后一个大时,即 arr[i+1] < arr[i]时,就将两个元素进行交换。循环这个操作。
需要注意的是,因为每次循环都能从最后一位开始确定一位最大的元素。所以无需再将这个确定的元素进行加入到遍历中,所以每次的循环条件都需要根据 i 的值 进行减短。
举例
初始序列
从头开始两两比较
1. 9 和 5 不满足升序要求,需要交换
2. 9 和 2 不满足升序要求,需要交换
3. 以此类推,此次循环的结果就是
此时已经确定最大的元素是9,无需再对它和前面一位元素作比较,所以下一次遍历只需要到前面一位元素即可。
第二次遍历就将序列排序完成
代码实现
public class bubbleSort{
public static void main(String[] args) {
int[] nums = {1,2,1,2,1,2,5,6,1};
//次数循环
for (int i = 0; i < nums.length-1; i++) {
//每次对相邻元素作比较,每次循环都会有一位元素被确定,所以j的值跟随i变小
for (int j = 0; j < nums.length-i-1; j++) {
if(nums[j] > nums[j+1]){
//交换
int target = nums[j];
nums[j] = nums[j+1];
nums[j+1] = target;
}
}
}
System.out.println(Arrays.toString(nums));
}
}
代码优化
考虑到可能出现上面例子中第二次遍历就将序列排序完成了,无需再进行后续的无意义遍历,采用设置一个布尔值记录是否进入了交换,如果进入了交换就将布尔值设为 false,代表进行了交换,排序还没完成,否则如果布尔为 true,表示排序已经完成了。
public class bubbleSort{
public static void main(String[] args) {
int[] nums = {1,2,1,2,1,2,5,6,1};
boolean flag = true;
for (int i = 0; i < nums.length-1; i++) {
//次数循环
for (int j = 0; j < nums.length-i-1; j++) {
//每次遍历交换元素
if(nums[j] > nums[j+1]){
int target = nums[j];
nums[j] = nums[j+1];
nums[j+1] = target;
flag = false;
}
}
if(flag){
//排序完成,结束循环
break;
}
}
System.out.println(Arrays.toString(nums));
}
}