概念
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
图解
如上图所示,假如是升序,排序冒泡排序从数组index=0开始,与相邻数值相互比较,若左边数值大于右边数值,则两数值交换位置,依次类推,直到将最大值放在数组末位。
int[] array = {10,5,6,15,1,3,8};
一轮比较之后15将在数组最末位,因此数组长度为7的外层循环比较次数为6
内层循环每次都从index=0开始两两比较
代码如下
//冒泡排序
public static void bubbleSort(int[] arry){
for (int i=0; i<arry.length-1; i++){
for (int j=0; j<arry.length-1-i; j++){
if (arry[j] > arry[j+1]){
//此处频繁交换数值,若数组很大则影响性能
int tmp = arry[j];
arry[j] = arry[j+1];
arry[j+1] = tmp;
}
}
}
}
代码优化如下
//冒泡排序
public static void bubbleSort(int[] arry){
int tmp;
for (int i=0; i<arry.length-1; i++){
//保存最大数的索引
int index = 0;
for (int j=0; j<arry.length-1-i; j++){
if (arry[index] < arry[j+1]){
index = j + 1;
}
}
//最后一位数值的索引
int last_index = arry.length-1-i;
if (index != last_index){
tmp = arry[index];
arry[index] = arry[last_index];
arry[last_index] = tmp;
}
}
}
本来我将优化代码int index = 0; 放在了外层循环外,循环过后index的值不为0导致顺序不对,经debug调试后发现问题,应将int index = 0;放在内层循环处,最后查看输出结果,如下图
int[] array = {10,5,6,15,1,3,8};
System.out.println("排序前:" + Arrays.toString(array));
bubbleSort(array);
System.out.println("排序后:" + Arrays.toString(array));
排序前:[10, 5, 6, 15, 1, 3, 8]
排序后:[1, 3, 5, 6, 8, 10, 15]