冒泡排序的核心点是:
通过一次遍历数组,判断相邻元素之间是否满足升序或降序的条件。如果不满足则交换这两个相邻的元素。当这一次遍历结束后,则将最大或最小的元素下沉到了数组的末尾。
所以,当数组的长度为n时,按照以上方式遍历n次数组,即可将整个数组按照规则排序。
在最坏的情况下,当数组的长度为n时,遍历n次数组,每次都存在元素交换。但是当除去这种最坏的情况时,我们可能只需要遍历更少的次数(剩下的次数不存在元素交换),就可以达到整个数组排序的目的。这样排序的效率会提高很多。
如下代码所示:
// 用法
int[] nums = new int[]{5, 3, 6, 9, 15, 12, 16, 2, 1};
sort(nums);
for (int i=0;i<nums.length;i++) {
System.out.println(nums[i]);
}
// 冒泡排序(优化)
private static void sort(int[] nums) {
int length = nums.length;
int temp;
// 增加一个flag标记
boolean flag;
for (int i=0;i<length;i++) {
// 每次遍历之前将flag重置为true
flag = true;
for(int j=0;j<length-i;j++) {
if(j+1<length-i && nums[j] > nums[j+1]) {
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
// 当在本次遍历之中存在元素交换时,将flag置为false。
flag = false;
}
}
// 当本次遍历结束后,如果flag还是初始的重置状态,则说明本次遍历没有元素交换。
// 即整个数组的顺序已排列好。此时直接跳出循环即可。
if (flag) {
break;
}
}
}