冒泡排序就像鱼吐泡泡一样,最大的泡泡会到最上面的位置,最小的泡泡在最下面
中心思想:
1.从数组第一个元素开始往后逐一比较,直至把本次比较序列最大的数换到数组最后一位结束
2.每一次比较序列比上一次比较序列少一位(最后一位已经确定,无需再做比较)
/**
* 冒泡排序
* 1.从数组第一位开始,如果比后面一位大就交换
* 2.每一轮确定一个最大数交换到数组末尾,下一轮比较上一轮最大数不再参与
* 3.直至最后一对数字比较完成确定位置
* 中心思想是像水泡一样,最大的泡泡在最上面
*
* @param array
*/
private static void bubbleSort(int[] array) {
/*循环数组长度的次数*/
for (int i = 0; i < array.length; i++) {
/*从第0个元素开始,依次和后面的元素进行比较
* j < array.length - 1 - i表示第[array.length - 1 - i]
* 个元素已经冒泡到了合适的位置,无需进行比较,可以减少比较次数*/
for (int j = 0; j < array.length - 1 - i; j++) {
/*如果第j个元素比后面的第j+1元素大,交换两者的位置*/
if (array[j + 1] < array[j]) {
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
}
}
}
优化:
1.外层循环开始时增加交换标记:swapFlag = false
2.内层循环如果发生交换:swapFlag = true
3.内层循环结束后如果未发生交换,即: swapFlag ==false 时结束方法
优化后代码:
/**
* 冒泡排序
* 1.从数组第一位开始,如果比后面一位大就交换
* 2.每一轮确定一个最大数交换到数组末尾,下一轮比较上一轮最大数不再参与
* 3.直至最后一对数字比较完成确定位置
* 中心思想是像水泡一样,最大的泡泡在最上面
*
* @param array
*/
private static void bubbleSort(int[] array) {
/*循环数组长度的次数*/
for (int i = 0; i < array.length; i++) {
/*交换标志*/
boolean swapFlag = false;
/*从第0个元素开始,依次和后面的元素进行比较
* j < array.length - 1 - i表示第[array.length - 1 - i]
* 个元素已经冒泡到了合适的位置,无需进行比较,可以减少比较次数*/
for (int j = 0; j < array.length - 1 - i; j++) {
/*如果第j个元素比后面的第j+1元素大,交换两者的位置*/
if (array[j + 1] < array[j]) {
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
swapFlag = true;
}
}
/*一轮冒泡结束未发生交换,表明数组排序已经完成,直接结束*/
if (!swapFlag) {
return;
}
}
}