冒泡排序的基本思想是:对相邻的元素进行两两比较,顺序相反则进行交换,这样每一轮循环,最大(或最小)的元素会被交换到最后的位置。
package com.example.datastructures.sort;
import java.util.Arrays;
/**
* @author maoyouhua
* @version jdk21
*
* 冒泡排序的基本思想是:对相邻的元素进行两两比较,顺序相反则进行交换,这样每一轮循环,最大(或最小)的元素会被交换到最后的位置。
*/
public class BubbleSort {
/**
* 基础冒泡排序,时间复杂度O(n^2)
*
* flag 用来优化循环次数,当没有发生交换时提前结束排序
*
* 3,9,-1,10,-2 计算次数 对比次数
* 3,-1,9,-2,10 1 4
* -1,3,-2,9,10 2 3
* -1,-2,3,9,10 3 2
* -2,-1,3,9,10 4 1
*
* @param arr 排序数组
*/
private static void bubbleSort(int[] arr){
//数组是从0开始算的,外层是计算次数,里层是对比次数
int temp = 0;
for (int i = 0; i < arr.length - 1; i++) {
boolean flag = false;
for (int j = 0; j < arr.length -1 - i; j++) {
if (arr[j] > arr[j+1]) {
flag = true;
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
System.out.println("第"+ (i+1) +"次排序");
System.out.println(Arrays.toString(arr));
if (!flag) {
break;
}
}
}
/**
* 排序效率测试
* 花费时间是:6509毫秒
*/
private static void efficiencyTest(){
int capacity = 80000;
int[] arr = new int[capacity];
for (int i = 0; i < capacity; i++) {
arr[i] = (int)(Math.random() * 100 * capacity);
}
long start = System.currentTimeMillis();
bubbleSort(arr);
long end = System.currentTimeMillis();
System.out.println("花费时间是:" + (end - start) + "毫秒");
}
/**
*第1次排序
* [3, -1, 9, -2, 7, 0, 3, 8, 10]
* 第2次排序
* [-1, 3, -2, 7, 0, 3, 8, 9, 10]
* 第3次排序
* [-1, -2, 3, 0, 3, 7, 8, 9, 10]
* 第4次排序
* [-2, -1, 0, 3, 3, 7, 8, 9, 10]
* 第5次排序
* [-2, -1, 0, 3, 3, 7, 8, 9, 10]
*/
public static void main(String[] args) {
int[] arr = {3,9,-1,10,-2,7,0,3,8};
bubbleSort(arr);
efficiencyTest();
}
}