i从0开始,array[i]与array[i+1]比较,如果array[i]>array[i+1],那么就交换位置
经过一次排序后会将最大的值冒泡到最后一位
public void bubbleSort(int array[]) { for (int i = 0; i < array.length; i++) { // 由于array[j]与array[j+1]相比较,遍历到最后时应该位j+1=array.length,所以j<array.length-1 for (int j = 0; j < array.length - 1; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } }
优化1
先看每一次遍历的最后一位
第一次遍历后,最大值被冒泡到第 i 位
第二次遍历后,第二大的值被冒泡到第 i-1 位
第三次遍历后,第三大的值被冒泡到第 i-2 位
...
因此每一次遍历后的最后一位不必再次比较
public void bubbleSort(int array[]) { for (int i = 0; i < array.length; i++) { // 每一次遍历后最后一位都是最大的,无需重新比较,所以遍历到 array.length-1位就可以了 for (int j = 0; j < array.length - i - 1; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } }
优化2
假如在某一次遍历完成后,数组已经完成了排序,那么就不用继续遍历
public void bubbleSort(int array[]) { for (int i = 0; i < array.length; i++) { boolean isSorted = true;//标志是否已排序 for (int j = 0; j < array.length - i - 1; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; isSorted = false; } } if (isSorted) { break; } } }
优化3
在某一次遍历后,最后很大一部分已经是有序的,此时可以无需对这部分在做排序,如 [3, 2, 1, 6, 7, 8, 9, 10],从array[3]之后就是有序的,我们可以在每一轮排序的最后,记录下最后一次元素交换的位置,即无序数组的边界位置
public void bubbleSort(int array[]) { int sortBorder = array.length - 1;//无需数组的边界 int lastExchageIndex = 0;//记录最后交换的位置 for (int i = 0; i < array.length; i++) { boolean isSorted = true; for (int j = 0; j < sortBorder; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; isSorted = false; lastExchageIndex = j; } } sortBorder = lastExchageIndex; if (isSorted) { break; } } }
参考https://blog.csdn.net/wubingju93123/article/details/81215984
原文:https://www.cnblogs.com/lz-0011/p/12078528.html