前言:我们用大量的数据测试了冒泡排序,发现该算法的执行效率十分低下
思路:我们用一个变量判断它元素的位置是否变化,有变化执行,无变化不执行。
package cn.itjy.sort;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Random;
public class BubbleSort {
public static void main(String[] args) {
// int[] arr = { 3,9,-1,10,20};
// 为了容易理解,我们把冒泡排序的演变过程,给大家栈是出来
// 测试冒泡排序的速度O(n2) 80000个数据
// 创建8000个的随机的数组
Random r = new Random();
int[] arr = new int[8000];
for (int j = 0; j < arr.length; j++) {
arr[j] = r.nextInt(8000);
}
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String startTime = sd.format(new Date());
System.out.println("排序前的时间=" + startTime);
// 第一趟排序,就是将最大的数排在最后
// System.out.println("before:" + Arrays.toString(arr));
bubbleSort(arr);
System.out.println("after:" + Arrays.toString(arr));
SimpleDateFormat sd2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String endTime = sd2.format(new Date());
System.out.println("排序后的时间=" + endTime);
/*
* // 第二趟排序,就是将第二大的数排在第二位 for (int i = 0; i < arr.length -2; i++) { // 如果 if
* (arr[i] > arr[i + 1]) { // 9 3 temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] =
* temp; } } System.out.println("第二趟排序后的数组");
* System.out.println(Arrays.toString(arr));
*
* // 第三趟排序,就是将第三大的数排在第三位 for (int i = 0; i < arr.length -3; i++) { // 如果 if
* (arr[i] > arr[i + 1]) { // 9 3 temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] =
* temp; } } System.out.println("第三趟排序后的数组");
* System.out.println(Arrays.toString(arr)); // 第四趟排序,就是将第四大的数排在第四位 for (int i =
* 0; i < arr.length -4; i++) { // 如果 if (arr[i] > arr[i + 1]) { // 9 3 temp =
* arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } }
* System.out.println("第四趟排序后的数组"); System.out.println(Arrays.toString(arr));
*/
}
// 将前面的冒泡排序算法,封装成一个方法
public static void bubbleSort(int[] arr) {
int temp = 0;
boolean flag = false; // 标识变量,表示是否进行过交换
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
// 如果
if (arr[j] > arr[j + 1]) { // 9 3
flag = true;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
if (!flag) { // 在排序中,一次交换都没有发生过
break;
} else {
flag = false; // 重置false,进行下次判断
}
}
}
}
总结:在排序中,一次交换都没有发生过,就进行下次判断,不用执行判断下面的代码。