冒泡排序算法
基本介绍
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移至后部。就像水底下的气泡一样逐渐向上冒
分析
/**
对 3 9 -1 10 20 进行冒泡排序
**/
冒泡排序规则小结:
- 一共进行数组的大小-1次大的循环( size-1)
- 每一趟排序的次数在逐渐的减少 (size-i-1)
代码实现
package F排序;
import java.util.Arrays;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/1/3 0003 16:47
* 冒泡排序
*/
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {3,9,-1,10,20};
System.out.println("原始数组"+Arrays.toString(arr));
bubbleSort(arr);
System.out.println("最终的排序结果为"+Arrays.toString(arr));
}
public static void bubbleSort(int[] arr){
int size = arr.length;//数组的长度
for(int i =0;i<size-1;i++){//需要排序size-1趟
/**
第一趟排序就是将最大的数排在最后
第二趟排序就是将次大的数排在倒数第二个位置
。。。。。。。。。。。
**/
for(int j=0;j<size-i-1;j++){//从第一个元素开始两两对比
if(arr[j]>arr[j+1]){//假如前面的数比后面的数大,则交换
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
System.out.println("第"+i+"趟;"+"第("+j+"论的排序结果为"+Arrays.toString(arr));
}
System.out.println("======================");
}
}
}
实现的结果
存在的问题:大量重复判断,重复的比较判断
代码的改进
优化
==因为在排序的过程中,各元素不断接近自己的位置,如果下一趟比较下来没有进行过交换,就说明序列有序。==因此要在排序过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的比较。
/**
* 改进的算法
* @param arr
*/
public static void bubbleSort2(int[] arr){
int size = arr.length;//数组的长度
for(int i =0;i<size-1;i++){//需要排序size-1趟
boolean flag = false; //用来标志是否进行交换
for(int j=0;j<size-i-1;j++){//从第一个元素开始两两对比
if(arr[j]>arr[j+1]){//假如
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag = true;
}
System.out.println("第"+i+"趟;"+"第("+j+"论的排序结果为"+Arrays.toString(arr));
}
System.out.println("======================");
if(!flag){//没有进行交换说明已经有序,则停止冒泡
break;
}
}
}
性能的分析
//测试一下冒泡排序的速度O(n^2) ,给80000个数据,测试
//创建要给80000个随机的数组
int[] arr = new int[80000];
for (int i=0;i<80000;i++){
arr[i]=(int)(Math.random()*800000);//产生一个[0,800000)的随机数
}
Date date1 = new Date();
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1Str = simpleDateFormat1.format(date1);
System.out.println("排序前的时间是"+date1Str);
//测试冒泡排序
bubbleSort(arr);
Date date2 = new Date();
String date2Str = simpleDateFormat1.format(date2);
System.out.println("排序后的时间是"+date2Str);
/**
运行结果:
排序前的时间是2020-01-03 17:56:38
排序后的时间是2020-01-03 17:56:53
8000个数据排序大概是 8秒(不同电脑性能可能不一样)
**/