概述
冒泡排序是所有排序里最基础也是程序员必须要会手写的排序算法,他的实现原理其实很简单,就像水泡从水底冒出一样,一颗一颗的往上冒。它默认是从大到小排序,按顺序依次比较相邻的两个数,将小数换到前面,大数换到后面。依次比较n-1轮后获得一个由小到大的有序数组
图解
如上图,这是第一遍的详解,原数据是[8,6,7,9,1]。第一次:取出第一个数8和第二个数6作比较,8大于6,大数在后,小数在前,即交换8和6的位置,变成[6,8,7,9,1]。第二次:取出第二个数8和第三个数7作比较,8大于7,交换位置,变成[6,7,8,9,1]。第三次:取出第三个数8和第四个数9作比较,8小于9,那么此次不需要交换位置。第四次:取出第四个数字9和第五个数字1作比较,9大于1,交换位置,变成[6,7,8,1,9]。至此第一轮冒泡结束,筛选出最大的数字9。
如上图,这是全过程,第一遍找出最大数9,第二遍找出第二大数字8,第三遍找出第三大数7,第四遍找出第四大数6,最后只剩1不需要自己比较,所以最终得到的结果为[1,6,7,8,9]
代码
public void BubbleSort(int array[]){
int count = 0;//进行的轮数
for(int i=0;i<array.length-1;i++){//循环控制轮数
for(int j=0;j<array.length-1-i;j++){//循环控制每轮进行比较的次数
count++;//每一轮都加一
if(array[j]>array[j+1]){//判断是否大数在前小数在后,并且交换大小数的位置
int temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
}
}
}
}
时间复杂度
第一轮需要比较(n-1)次,第二轮比较(n-2)次…第(n-1)轮需要比较1次则总共需要比较 ∑ i = 1 n − 1 ( n − i ) = 1 + 2 + 3 + . . . + n − 1 = n 2 2 − n 2 \sum_{i=1}^{n-1} (n-i) =1+2+3+...+n-1=\frac{n^2}{2}-\frac{n}{2} ∑i=1n−1(n−i)=1+2+3+...+n−1=2n2−2n次,所以冒泡排序的时间复杂度为:O( n 2 n^2 n2)