思路:每次循环与数组前一位作比较,如果比他小,则交换,一次循环确定一个元素的位置
优化思路1:如果在循环过程中,没有进行交换,那就说明已经排序完成,就没有必要进行下一轮循环,所以使用sorted判断是否排序完成,若排序完成则直接返回true,若进行了交换,则返回false并进行下一轮循环。(全部排序完成的概率较小)
优化思路2:如果排序过程中进行了交换,则将交换的位置begin记录下来,begin之后的元素表示已经排序完成,将sortedIndex赋值给end,减少循环次数。(某一段排序完成的概率较大)
java代码:
//冒泡排序
public static void bubbleSort(int[] array){
//每次循环确定一个最大值,所以end--
for (int end = array.length - 1; end > 0; end--){
//是否已经排序完成
//全部循环结束会确定一个最大值
for (int begin = 1; begin <= end; begin++) {
//如果前一位比后一位小则交换,反之则不变,进行下一次循环,继续比较大小。
if (array[begin] < array[begin - 1]){
int temp = array[begin - 1];
array[begin - 1] = array[begin];
array[begin] = temp;
}
}
}
}
//冒泡排序优化1:全部排序完成的情况
public static void bubbleSort1(int[] array){
//每次循环确定一个最大值,所以end--
for (int end = array.length - 1; end > 0; end--){
//是否已经排序完成
boolean sorted = true;
//全部循环结束会确定一个最大值
for (int begin = 1; begin <= end; begin++) {
//如果前一位比后一位小则交换,反之则不变,进行下一次循环,继续比较大小。
if (array[begin] < array[begin - 1]){
int temp = array[begin - 1];
array[begin - 1] = array[begin];
array[begin] = temp;
sorted = false;
}
}
//如果sorted是true则直接break,因为没有出现array[begin] < array[begin - 1]的情
况
if (sorted) break;
}
}
//冒泡排序优化2:某一段排序完成的情况
public static void bubbleSort2(int[] array){
//每次循环确定一个最大值,所以end--
for (int end = array.length - 1; end > 0; end--){
//sortedIndex的初始值在数组完全有序的时候有用
int sortedIndex = 0;
//全部循环结束会确定一个最大值
for (int begin = 1; begin <= end; begin++) {
//如果前一位比后一位小则交换,反之则不变,进行下一次循环,继续比较大小。
if (array[begin] < array[begin - 1]){
int temp = array[begin - 1];
array[begin - 1] = array[begin];
array[begin] = temp;
sortedIndex = begin;
}
}
end = sortedIndex;
}
}