①、比较相邻的元素。若是第一个比第二个大,就交换他们两个。算法
②、对每一对相邻元素做一样的工做,从开始第一对到结尾的最后一对。这步作完后,最后的元素会是最大的数(也就是第一波冒泡完成)。数组
③、针对全部的元素重复以上的步骤,除了最后一个。性能
④、持续每次对愈来愈少的元素重复上面的步骤,直到没有任何一对数字须要比较。测试
public static int[] sort(int[] array){ //这里for循环表示总共须要比较多少轮 for(int i=1;i<array.length;i++){ // j的范围很关键,这个范围是在逐步缩小的,由于每轮比较都会将最大的放在右边 for(int j=0;j<array.length-i;j++){ if(array[j]>array[j+1]){ int temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } } return array; }
public static void main(String[] args) { int [] array = {9,222,100,4,8,6,35,2,4,1,0}; Maopao.sort(array); for(int i=0;i<array.length;i++){ System.out.println(array[i]); } }
冒泡排序是由两个for循环构成,第一个for循环的变量 i 表示总共须要多少轮比较,第二个for循环的变量 j 表示每轮参与比较的元素下标【0,1,......,length-i】,由于每轮比较都会出现一个最大值放在最右边,因此每轮比较后的元素个数都会少一个,这也是为何 j 的范围是逐渐减少的。相信你们理解以后快速写出一个冒泡排序并不难。spa
假设参与比较的数组元素个数为 N,则第一轮排序有 N-1 次比较,第二轮有 N-2 次,如此类推,这种序列的求和公式为:code
(N-1)+(N-2)+...+1 = N*(N-1)/2blog
当 N 的值很大时,算法比较次数约为 N2/2次比较,忽略减1。排序
假设数据是随机的,那么每次比较可能要交换位置,可能不会交换,假设几率为50%,那么交换次数为 N2/4。不过若是是最坏的状况,初始数据是逆序的,那么每次比较都要交换位置。for循环
交换和比较次数都和N2 成正比。因为常数不算大 O 表示法中,忽略 2 和 4,那么冒泡排序运行都须要 O(N2) 时间级别。性能分析
其实不管什么时候,只要看见一个循环嵌套在另外一个循环中,咱们均可以怀疑这个算法的运行时间为 O(N2)级,外层循环执行 N 次,内层循环对每一次外层循环都执行N次(或者几分之N次)。这就意味着大约须要执行N2次某个基本操做。