原理:将序列划分为无序和有序区,不断通过交换较大元素至无序区尾完成排序。
要点:设计交换判断条件,提前结束以排好序的序列循环。
private static void sortBubble(int[] array) {
boolean isSort = true;
for (int i = 1; i < array.length && isSort; i++) {
isSort = false; //是否需要排序
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;
isSort = true;
}
}
printArray(String.format(Locale.getDefault(), "第 %2d 趟 : ", i), array);
}
}
结果:
原数组: 55 22 66 33 11 99 77 44 88
冒泡排序:
第 0 趟 : 22 55 33 11 66 77 44 88 99
第 1 趟 : 22 33 11 55 66 44 77 88 99
第 2 趟 : 22 11 33 55 44 66 77 88 99
第 3 趟 : 11 22 33 44 55 66 77 88 99
第 4 趟 : 11 22 33 44 55 66 77 88 99
局部排序
private static void sortBubble(int[] array, int start, int end) {
boolean isSort = true;
end = Math.min(end, array.length);
for (int i = start; i < end && isSort; i++) {
isSort = false;
for (int j = start; j < end - 1; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
isSort = true;
}
}
printArray(String.format(Locale.getDefault(), "第 %2d 趟 : ", i), array);
}
}
对数组的【2,7)排序结果:
原数组: 55 22 66 33 11 99 77 44 88
冒泡排序:
第 2 趟 : 55 22 33 11 66 77 99 44 88
第 3 趟 : 55 22 11 33 66 77 99 44 88
第 4 趟 : 55 22 11 33 66 77 99 44 88