基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止(大话数据结构)
白话翻译:从位置0开始,比较前i个数中,相邻两个数的大小。大的换到后面。小的换到前面。这就像轻的水泡向上冒。所以叫冒泡排序
冒泡排序中,一趟排序,就会把前length-1-i个数中最大数沉底。比如下图:
冒泡排序总是从0个位置开始,到上次排好序的位置为止。两两交换逆序元素
代码:
public class MaoPao {
public static void main(String[] args){
int[] arrays = {4,2,3,1,5,8,9,6};
msort(arrays);
for(int i=0;i<arrays.length;i++){
System.out.println(arrays[i]);
}
}
public static int[] msort(int[] arrays){
for(int i=0;i<arrays.length;i++){
for(int j=0;j<arrays.length-1-i;j++){
if(arrays[j]>arrays[j+1]){
int temp = arrays[j];
arrays[j]=arrays[j+1];
arrays[j+1]=temp;
}
}
}
return arrays;
}
}
优化:上面的代码要排序n-1趟,并且每趟都要比较相邻两个数的大小。如果数组在中间任何一趟就排好序的话,后面的比较都是在浪费资源
使用一个boolean类型来记录是否进行了交换。如果没有交换,意味着数组已经正序,直接退出比较
public class MaoPao {
public static void main(String[] args){
int[] arrays = {4,2,3,1,5,8,9,6};
msort(arrays);
for(int i=0;i<arrays.length;i++){
System.out.println(arrays[i]);
}
}
public static int[] msort(int[] arrays){
for(int i=0;i<arrays.length;i++){
boolean flag = false;
for(int j=0;j<arrays.length-1-i;j++){
if(arrays[j]>arrays[j+1]){
int temp = arrays[j];
arrays[j]=arrays[j+1];
arrays[j+1]=temp;
flag=true;
}
}
if(flag==false){
break;
}
}
return arrays;
}
}