思路:每次冒泡排序操作都会将相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足,就交换这两个相邻元素的次序,一次冒泡至少让一个元素移动到它应该排列的位置,重复N次,就完成了冒泡排序。
package com.ycx.test;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int arr[]={0,2,9,5,7,6};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void bubbleSort(int [] arr ){
int temp;
for(int i=0;i<arr.length-1;i++){
//提前结束标识
boolean flag = true;
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag=false;
}
}
if(flag){
return;
}
}
}
}
如果当次冒泡操作没有数据交换时,那么就已经达到了有序状态,可以提前结束冒泡排序,这个就是优化。
时间复杂度
如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,
即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。
如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:即最坏情况下时间复杂度为O(n2)【n的平方】;
所以,冒泡排序总的平均时间复杂度为:O(n2) 。