冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
package com.zx.ds.ds0731;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int array[] = {2, 5, 4, 3, 1};
System.out.println(Arrays.toString(array));
int temp=0;
for(int i=1;i<array.length;i++){
System.out.println(i+"----");
for(int j=0;j<array.length-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));
}
}
}
//
[2, 5, 4, 3, 1]
1----
[2, 4, 3, 1, 5]
2----
[2, 3, 1, 4, 5]
3----
[2, 1, 3, 4, 5]
4----
[1, 2, 3, 4, 5]
冒泡排序过程演示
原始数组: 2 5 4 3 1
第一趟排序
(1) 2 5 4 3 1 //如果相邻的元素逆序就交换
(2) 2 4 5 3 1
(3) 2 4 3 5 1
(4) 2 4 3 1 5
第二趟排序
(1) 2 4 3 1 5
(2) 2 3 4 1 5
(3) 2 3 1 4 5
第三趟排序
(1) 2 3 1 4 5
(2) 2 1 3 4 5
第四趟排序
(1) 1 2 3 4 5
结论:
1. 一共进行array.length-1 次大的循环
2. 每一趟排序的次数在逐渐减少
3. 如果我们发现在某趟排序中,没有发生一次交换,可以提前结束冒泡排序。这个就是优化
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)
package com.zx.ds.ds0731;
//对冒泡排序进行改进
//设置flag 判断 数组不发生变化即退出循环 排序结束
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class BubbleSort2 {
public static void sort(int [] array){
int temp=0;
for(int i=1;i<array.length;i++){
//System.out.println(i+"----");
boolean flag=true;
for(int j=0;j<array.length-i;j++){
if(array[j]>array[j+1]){
flag=false;
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
//System.out.println(Arrays.toString(array));
if(flag){
break;
}
}
}
public static void main(String[] args) {
int array[] = {2, 5, 4, 3, 1};
System.out.println(Arrays.toString(array));
sort(array);
System.out.println(Arrays.toString(array));
int big[]=new int[80000];
for(int i=0;i<big.length;i++){
//public static double random()
big[i]=(int)(Math.random()*8000000);
}
Date date=new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String datetoStr=simpleDateFormat.format(date);
System.out.println("sort before:"+datetoStr);
sort(big);
Date date2=new Date();
SimpleDateFormat simpleDateFormat2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date2toStr=simpleDateFormat.format(date2);
System.out.println("sort after:"+date2toStr);
}
}
//
[2, 5, 4, 3, 1]
[1, 2, 3, 4, 5]
sort before:2020-07-31 11:49:13
sort after:2020-07-31 11:49:26
排序法 | 平均时间 | 最差情形 | 稳定度 | 额外空间 | 备注 | 80000随机数排序时间(s) |
---|---|---|---|---|---|---|
冒泡 | O(n²) | O(n²) | 稳定 | O(1) | n小时较好 | 13 |