一、冒泡排序
平均时间复杂度: O(n²)
最差时: O(n²)
是否稳定:
稳定 空间开销:O(1)
适合n较小时
原始数组:3 , 9, -1, 8, 2
第一趟排序:
(1) 3, 9, -1, 8,2
(2) 3, -1, 9,8, 2
(3) 3, -1, 8, 9, 2
(4)3, -1, 8, 2, 9 9确定
第二趟排序:
(1)-1,3, 8, 2, 9
(2)-1, 3, 8, 2, 9
(3)-1,3,2, 8, 9 8 , 9确定
第三趟排序:
(1)-1,3 ,2 ,8 , 9
(2)-1, 2, 3 ,8 ,9 3, 8, 9确定
第四趟排序:
(1)-1, 2, 3, 8, 9 (2, 3, 8, 9确定)
实现:
int[] array = {3, 9, -1, 8, 2};
int temp=0;
for (int i=0; i< array.length-1;i++){
System.out.println("开始第"+(i+1)+"趟排序");
for (int j=0;j<array.length-1-i;j++){
if (array[j]>array[j+1]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
System.out.println(Arrays.toString(array));
}
System.out.println("第"+(i+1)+"趟排序结果:");
System.out.println(Arrays.toString(array));
System.out.println("------------------");
}
结果:
开始第1趟排序
[3, 9, -1, 8, 2]
[3, -1, 9, 8, 2]
[3, -1, 8, 9, 2]
[3, -1, 8, 2, 9]
第1趟排序结果:
[3, -1, 8, 2, 9]
------------------
开始第2趟排序
[-1, 3, 8, 2, 9]
[-1, 3, 8, 2, 9]
[-1, 3, 2, 8, 9]
第2趟排序结果:
[-1, 3, 2, 8, 9]
------------------
开始第3趟排序
[-1, 3, 2, 8, 9]
[-1, 2, 3, 8, 9]
第3趟排序结果:
[-1, 2, 3, 8, 9]
------------------
开始第4趟排序
[-1, 2, 3, 8, 9]
第4趟排序结果:
[-1, 2, 3, 8, 9]
------------------
总结:
1.共进行数组大小-1次循环
2.每次排序的次数逐渐减少
优化:
若一趟排序中没有一次交换,则停止循环
增加标志变量flag=false,发生交换时,置flag为true,一次循环后判断flag,若为true,则重置flag为false继续循环,否则break;
int[] array = {3, 9, -1, 8, 2};
boolean flag=false;
int temp=0;
for (int i=0; i< array.length-1;i++){
System.out.println("开始第"+(i+1)+"趟排序");
for (int j=0;j<array.length-1-i;j++){
if (array[j]>array[j+1]){
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
flag=true;
}
System.out.println(Arrays.toString(array));
}
System.out.println("第"+(i+1)+"趟排序结果:");
System.out.println(Arrays.toString(array));
System.out.println("------------------");
if (!flag){
//未发生一次交换,flag为false
break;
}else {
//发生了交换,flag被置为true
flag=false; //重置flag,继续循环
}
}
这里因为数据原因仍然执行了4次
可以换一组数据:{3,9,-1,8,10}
结果:
开始第1趟排序
[3, 9, -1, 8, 10]
[3, -1, 9, 8, 10]
[3, -1, 8, 9, 10]
[3, -1, 8, 9, 10]
第1趟排序结果:
[3, -1, 8, 9, 10]
------------------
开始第2趟排序
[-1, 3, 8, 9, 10]
[-1, 3, 8, 9, 10]
[-1, 3, 8, 9, 10]
第2趟排序结果:
[-1, 3, 8, 9, 10]
------------------
开始第3趟排序
[-1, 3, 8, 9, 10]
[-1, 3, 8, 9, 10]
第3趟排序结果:
[-1, 3, 8, 9, 10]
------------------
可以看到只执行了三次排序
测试十万条数据执行时间:
//创建50000个随机数组
int[] array =new int[100000];
for (int i=0;i<100000;i++){
array[i]=(int)(Math.random()*100000);
}
long begintime=System.currentTimeMillis();
System.out.println("开始时间"+begintime);
bubbleSort(array);
long endtime=System.currentTimeMillis();
System.out.println("结束时间"+endtime);
System.out.println("用时:"+(endtime-begintime)+"ms");
结果:
开始时间1572061280770
结束时间1572061302883
用时:22113ms
当然每次执行时间不一样,但当数据大的时候总体效率还是很低的
来源:https://blog.csdn.net/weixin_43696529/article/details/102754903