1 核心思想
把数组从第一项开始,依次两两比较,如果前项大于后项,则二者对换位置。
2 代码实现
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
bubbleSort();
}
public static void bubbleSort(){
int[] array = {3,4,5,2,1};
System.out.println("排序前:"+Arrays.toString(array));
for(int i = array.length - 1 ; i > 0; i--){
findMax(array , i);
}
}
/*
* 将目标数组中前i个数中最大值排到末尾
* @param array:目标数组, i:前i个数
*/
public static void findMax(int[] array , int i){
for(int j = 0 ; j < i ; j++){
if(array[j] > array[j+1]){
changePosition(array, j , j+1);
System.out.println("排序后:"+Arrays.toString(array));
}
}
}
public static void changePosition(int[] array, int source , int target){
int temp = array[target];
array[target] = array[source];
array[source] = temp;
}
}
结果:
排序前:[3, 4, 5, 2, 1]
排序后:[3, 4, 5, 2, 1]
排序后:[3, 4, 5, 2, 1]
排序后:[3, 4, 2, 5, 1]
排序后:[3, 4, 2, 1, 5]
排序后:[3, 4, 2, 1, 5]
排序后:[3, 2, 4, 1, 5]
排序后:[3, 2, 1, 4, 5]
排序后:[2, 3, 1, 4, 5]
排序后:[2, 1, 3, 4, 5]
排序后:[1, 2, 3, 4, 5]
详细解析:
排序前:[3, 4, 5, 2, 1]
//i=0,外部循环开始
//array[0]=3 < 4(array[1]),不换
排序后:[3, 4, 5, 2, 1]
//array[1]=4 < 5(array[2]),不换
排序后:[3, 4, 5, 2, 1]
//array[2]=5 > 2(array[3]), 换
排序后:[3, 4, 2, 5, 1]
//array[3]=5 >1 (array[4]),换
排序后:[3, 4, 2, 1, 5]
//j=4 不小于 5-1-0 ,循环结束
//i=1
//array[0]=3 <4 (array[1]),不换
排序后:[3, 4, 2, 1, 5]
//array[1]=4 > 2(array[2]),换
排序后:[3, 2, 4, 1, 5]
//array[2]=1 < 4(array[3]),不换
排序后:[3, 2, 1, 4, 5]
//j=3 不小于 5-1-1,循环结束
//i=2
//array[0]=3 > 2(array[1]),换
排序后:[2, 3, 1, 4, 5]
//array[1]=3 > 1(array[2]),换
排序后:[2, 1, 3, 4, 5]
//j=2 不小于 5-1-2,循环结束
//i=3
//array[0]=2 > 1(array[1]),换
排序后:[1, 2, 3, 4, 5]
j=1 不小于 5-1-3,循环结束
复杂度
时间复杂度:O(n²)
空间复杂度:O(1)
讲解视频(马士兵老师)
马士兵说:冒泡排序算法