public static void bubbleSort(int[] arr) {
int count = 0 ;
System.out.println("待排序数组:" + Arrays.toString(arr));
for (int i=0;i<arr.length-1;i++) {
for (int j=0;j<arr.length-1-i;j++) {
count++ ;
if (arr[j]>arr[j+1]) {
int temp = arr[j] ;
arr[j] = arr[j+1] ;
arr[j+1] = temp ;
}
}
System.out.println("第" + (i+1) + "次排序结果:" + Arrays.toString(arr));
}
System.out.println("#bubbleSort forloop count - " + count);
}
执行一下:
int[] arr = new int[]{12,4,54,57,87,3,41,1,3,4,1,3,4,31,2} ;
bubbleSort(arr);
System.out.println("最终结果:" + Arrays.toString(arr));
结果:
待排序数组:[12, 4, 54, 57, 87, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2]
#第1次排序结果:[4, 12, 54, 57, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 87]
#第2次排序结果:[4, 12, 54, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 57, 87]
#第3次排序结果:[4, 12, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 54, 57, 87]
#第4次排序结果:[4, 3, 12, 1, 3, 4, 1, 3, 4, 31, 2, 41, 54, 57, 87]
#第5次排序结果:[3, 4, 1, 3, 4, 1, 3, 4, 12, 2, 31, 41, 54, 57, 87]
#第6次排序结果:[3, 1, 3, 4, 1, 3, 4, 4, 2, 12, 31, 41, 54, 57, 87]
#第7次排序结果:[1, 3, 3, 1, 3, 4, 4, 2, 4, 12, 31, 41, 54, 57, 87]
#第8次排序结果:[1, 3, 1, 3, 3, 4, 2, 4, 4, 12, 31, 41, 54, 57, 87]
#第9次排序结果:[1, 1, 3, 3, 3, 2, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第10次排序结果:[1, 1, 3, 3, 2, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第11次排序结果:[1, 1, 3, 2, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第12次排序结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第13次排序结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第14次排序结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#bubbleSort forloop count - 105
最终结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
冒泡排序的思想,说直白点就是每次冒泡选出最大值,并且每次选出的最大值不参与下次排序。
冒泡排序的进一步优化:
上面的冒泡排序算法确实已经很高效了,但是我们仔细看输出结果,第12次、13次、14次,其排序结果相同,也就是说,实际到第12次排序已经完成,13、14次为无效操作。我们加个标记,对过程进行进一步优化:
public static void bubbleSort_up(int[] arr) {
int count = 0 ;
System.out.println("待排序数组:" + Arrays.toString(arr));
for (int i=0;i<arr.length-1;i++) {
boolean isComplete = true ;
for (int j=0;j<arr.length-1-i;j++) {
count++ ;
if (arr[j]>arr[j+1]) {
int temp = arr[j] ;
arr[j] = arr[j+1] ;
arr[j+1] = temp ;
if (isComplete)
isComplete = false ;
}
}
System.out.println("#第" + (i+1) + "次排序结果:" + Arrays.toString(arr));
if (isComplete)
break;
}
System.out.println("#bubbleSort_up forloop count - " + count);
}
我们每一次外层循环开始时,记录一个完成排序标记,如果内层循环有变动,则标记为false,否则为true,看结果:
待排序数组:[12, 4, 54, 57, 87, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2]
#第1次排序结果:[4, 12, 54, 57, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 87]
#第2次排序结果:[4, 12, 54, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 57, 87]
#第3次排序结果:[4, 12, 3, 41, 1, 3, 4, 1, 3, 4, 31, 2, 54, 57, 87]
#第4次排序结果:[4, 3, 12, 1, 3, 4, 1, 3, 4, 31, 2, 41, 54, 57, 87]
#第5次排序结果:[3, 4, 1, 3, 4, 1, 3, 4, 12, 2, 31, 41, 54, 57, 87]
#第6次排序结果:[3, 1, 3, 4, 1, 3, 4, 4, 2, 12, 31, 41, 54, 57, 87]
#第7次排序结果:[1, 3, 3, 1, 3, 4, 4, 2, 4, 12, 31, 41, 54, 57, 87]
#第8次排序结果:[1, 3, 1, 3, 3, 4, 2, 4, 4, 12, 31, 41, 54, 57, 87]
#第9次排序结果:[1, 1, 3, 3, 3, 2, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第10次排序结果:[1, 1, 3, 3, 2, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第11次排序结果:[1, 1, 3, 2, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第12次排序结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#第13次排序结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
#bubbleSort_up forloop count - 104
最终结果:[1, 1, 2, 3, 3, 3, 4, 4, 4, 12, 31, 41, 54, 57, 87]
少一次,这是因为我们这一组数字只少排序了最后一个循环,最后一次j=length-1-i,只有一次排序操作,我们换一组数来看效果:
执行: