1. 概念
冒泡排序是一种简单的排序算法。只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序工作。
2.原理
1.比较相邻的元素。如果第一个比第二个大,就交换它们两个;
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
3.针对所有的元素重复以上的步骤,除了最后一个;
4. 重复步骤1~3,直到排序完成(需要注意的每过一次外部循环,内部循环的变量需要减1,因为最大数已经到最右边了)。
3.算法分析
最佳情况:T(n) = O(n) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2)
4.插图参考链接
5.测试用例
比如要排序这个数组3 2 5 4 8,带着问题去写代码,一定要手写出来!,一定要手写出来!,光看没用
public class MaoPaoSort {
/**
* 普通玩法就是挨个对比,需要注意点是每次对比一次后面就不用再次对比了,需要n-1
* @param array
* @param n
*/
private static void bubbleSort1(int[] array,int n){
if(n<=1){
return;
}
for(int i=0;i<n;i++){
for(int j=0;j<n-i-1;j++){
if(array[j+1]<array[j]){
int temp= array[j+1];
array[j+1]=array[j];
array[j]=temp;
}
}
}
}
/**
* 普通玩法增强版
* @param array
* @param n
*/
private static void bubbleSort2(int[] array,int n){
if(n<=1){
return;
}
for(int i=0;i<n;i++){
//循环一次没有可替换,可提前退出冒泡的标志位
boolean flag=false;
for(int j=0;j<n-i-1;j++){
if(array[j+1]<array[j]){
int temp= array[j+1];
array[j+1]=array[j];
array[j]=temp;
flag=true;
}
}
if(!flag){
//没有数据交换,提前退出
break;
}
}
}
/**
* 增强版玩法
* @param array
*/
public static void bubbleSort3(int array[]){
for(int i=0;i<array.length-1;i++){
//有序标记,每一轮的初始值都是true
boolean isSorted=true;
//无序数列的边界,每次比较只需要比到这里为止
int sortBorder=array.length-1;
for(int j=0;j<sortBorder;j++){
int tmp=0;
if(array[j]>array[j+1]){
tmp=array[j];
array[j]=array[j+1];
array[j+1]=tmp;
//因为有元素互换,所以不是有序的,标记为false
isSorted=false;
//把无须数列的边界更新为最后一次交换元素的位置
sortBorder=j;
}
}
if(isSorted){
break;
}
}
}
public static void main(String[] args) {
int[] array=new int[]{3,2,5,4,8};
bubbleSort3(array);
System.out.println(Arrays.toString(array));
}
}