第一版
找出每个位置的最大值,便于理解
import java.util.Arrays;
/**
* @description: 冒泡排序
* @author: xt
* @create: 2021-03-29 21:15
**/
public class bubble {
public static void main(String[] args) {
int[] arr={9,8,7,4,5,6,1,3,2};
//倒叙找到每个位置上最大的值
for (int i = arr.length-1; i >0 ; i--) {
findMax(arr,i);
}
System.out.print(Arrays.toString(arr));
}
/*
* @Author xt
* @Description 找到给定位置最大值
* @Date 21:28 2021/3/29
* @Param [arr, index]
* @return void
**/
static void findMax(int[] arr,int index){
for (int i = 0; i < index; i++) {
if(arr[i]>arr[i+1]){
swap(arr , i, i+1);
}
}
}
static void swap(int[] arr ,int i,int j){
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
第二版
冒泡排序最好的时间复杂度是O(n),有可能已经是有序的
import java.util.Arrays;
/**
* @description: 冒泡排序
* @author: xt
* @create: 2021-03-29 21:15
**/
public class bubble_V2 {
public static void main(String[] args) {
int[] arr={9,8,7,4,5,6,1,3,2};
//倒叙找到每个位置上最大的值
for (int i = arr.length-1; i >0 ; i--) {
//若初始序列为“正序”,则只需进行一趟排序,
//在排序过程中进行n-1次比较,且不移动记录
//这个时候最好的时间复制读是O(n)
boolean stopFlag=true;
for (int j = 0; j < i; j++) {
if(arr[j]>arr[j+1]){
swap(arr , j, j+1);
stopFlag=false;
}
}
//stopFlag为true代表内循环一轮后,没有交换,
//说明已经排好序了,可以暂停了
if(stopFlag){
break;
}
}
System.out.print(Arrays.toString(arr));
}
static void swap(int[] arr ,int i,int j){
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
参考
https://blog.csdn.net/wubingju93123/article/details/81215984?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161702583716780266241978%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161702583716780266241978&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-10-81215984.first_rank_v2_pc_rank_v29&utm_term=%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.4187