冒泡排序的优化,请看代码解释:
/**
* 冒泡排序(升序)
* 1.依次比较数组中相邻两个元素大小,若 a[i] > a[i + 1],则交换两个元素,两两都比较一遍为一轮冒泡,结果是让最大的元素排至最后。
* 2.重复以上步骤,直到整个数组有序
* 3.优化方式:每轮冒泡时,最后一次交换索引可以作为下一轮冒泡的比较次数,如果这个值为零,表示整个素组有序,直接退出外层循环即可
* @author CMXH
*/
public class BubbleSort {
public static void main(String[] args) {
int[] array = {4, 5, 1, 6, 7, 3, 2};
bubbleSort(array);
}
/**
* 冒泡排序(升序)
* @param a 目标数组
*/
public static void bubbleSort(int[] a) {
// 定义初始循环次数
int n = a.length - 1;
while (true) {
// 记录最后一次交换索引位置
int last = 0;
for (int i = 0; i < n; i++) {
System.out.println("比较次数:" + (i + 1));
// 如果当前值比后一位的值大,则调用交换方法,并为交换索引位置赋值
if (a[i] > a[i + 1]) {
swap(a, i, i + 1);
last = i;
}
}
// 修改循环次数为最后一次交换索引位置,下一次循环从此处开始,节省资源消耗
n = last;
System.out.println("执行一轮冒泡");
System.out.println(Arrays.toString(a));
// 当最后一次交换索引位置等于 0 时,代表没有发生交换,退出循环
if (n == 0) { break; }
}
}
/**
* 元素换位
*
* @param a 数组
* @param i 当前索引
* @param j 目标索引
*/
public static void swap(int[] a, int i, int j) {
int o = a[i];
a[i] = a[j];
a[j] = o;
}
}
运行结果如下: