冒泡排序的基本思想
时间复杂度为O(N^2)
每次比较两个相邻元素,如果他们的顺序错误就把它们交换过来。
举个栗子
例如我们需要将 12,35,99,18,76, 5个数进行从大到小排序,既然是从大到小排序,也就是越小越靠后。
首先比较第一个数和第二个数,第一个是12,第二个是35,发现12 小于35,由于是越小越靠后,因此要对这两个数交换位置,那么交换后的顺序为 35,12,99,18,76。按照之前的方法,我们比较第二个和第三个数,第二个是12第三个是99,99大于12,所以要交换两个数的位置,交换过的顺序为 35,99,12,18,76。以此类推,可以通过下图来看12的位置变化:
12,35,99,18,76 初始数据
35,12,99,18,76 第1次交换
35,99,12,18,76 第2次交换
35,99,18,12,76 第3次交换
35,99,18,76,12 第4次交换 (5-1,假设要排序的个数为m,那么比较次数m-1,那么最糟糕情况下交互次数就是m-1)
进行4次交换后,就成功把最小的数12给排到最后面了。
现在我们已经将最小的数给归位了,现在对剩下的数再进行归位,细节我就不讲了,就将下重要的。
对剩下4个数进行排序:
99,18,76,35,12 (交换了3次,比较次数3)
对剩下3个数进行排序:
99,76,18,35,12 (比较了1次【99,76】,交换了1次【18,76】,比较次数2)
对剩下2个数进行排序:
99,76,18,35,12 (交换了0次,比较1次)
就如同一个气泡,一步步向上翻滚,最后成功浮出水面,所以他叫冒泡排序。
代码
public static void main(String[] args) {
//生成数据源
//待排序个数
int n=5;
int src[]=new int[n];
src[0]=12;
src[1]=35;
src[2]=99;
src[3]=18;
src[4]=76;
//冒泡排序
//遍历第一个到最后一个
for (int i=0; i<n;i++) {//执行n次
//比较剩余的数据
for (int j=0 ;j<n-i-1; j++) {//j<n-i-1 防止src[j+1]数组越界,执行n-1次
if(src[j]<src[j+1]){
int temp=src[j+1];//最差情况执行n-1次
src[j+1]=src[j];//最差情况执行n-1次
src[j]=temp;//最差情况执行n-1次
}
}
}
//打印排序
for (int i=0; i<n;i++) {
System.out.println(src[i]);//最差情况执行n次
}
}
// 结果
// 99
// 76
// 35
// 18
// 12
}
为什么时间复杂度为O(N^2)
计算最糟糕情况
要排序的个数n
第一层for
执行了n次
第二层for
第一次比较了n-1次
第二次比较了n-2次
....
第n-1次比较了1次
执行的总次数
count=3(1+2+3+4+.....+n-1)(n为正整数)
打印for
执行了n次
所有总的次数:
sum=n+3(1+2+3+4+...+n-1)+n+(n-n)=3(1+2+3+4+...+n-1+n)-n
如果n为偶数
sum=3* n/2*(n+1) -n=3/2(n^2+n)-n=1/2(3n^2+n)
如果n为奇数
sum=3((n-1)/2 *n+(n+1)/2)-n=3/2(n^2+1)-n=1/2(3n^2-2n+3)
所以最差的情况的时间复杂度为O(N^2),最好的情况我就不推了,O(N)