时间复杂度 O(N)
冒泡排序的时间复杂度不会随着样本的改变而改变
流程说明
https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html 此网站以动图的形式非常清楚的展示了冒泡排序的过程 [3, 5, 2, 7, 6] idx 0 1 2 3 4 第一次: 0…N-1的位置上 [0]和 [1]对比大的往后交换,[1]和[2]对比大的往后交换 一共进行n-1 次 第一次: 0…N-2的位置上 [0]和 [1]对比大的往后交换,[1]和[2]对比大的往后交换 一共进行n-2 次 第一次: 0…N-3的位置上 [0]和 [1]对比大的往后交换,[1]和[2]对比大的往后交换 一共进行n-3 次 如此一直循环直到0…1位置,即n-m=0就停止了
代码示例
package com.ss;
import java.util.Arrays;
import java.util.Random;
/**
* <p>
* 冒泡排序
* </P>
*
* @author: zhangss
* @since: 2021-01-04
**/
public class BubbleSort {
/**
* 冒泡排序
* @param arr
*/
public static void bubbleSort(int[] arr){
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 0; j <= i - 1; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
/**
* 交换两个位置的值
* @param arr
* @param i
* @param j
*/
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/**
* 对数器
* 用来比较上述冒泡排序以后的顺序是否正确
* @param arr1
* @param arr2
* @return
*/
public static boolean comparator(int[] arr1, int[] arr2){
if(arr1.length != arr2.length){
return false;
}
Arrays.sort(arr1);
for (int i = 0; i < arr1.length; i++) {
if(arr1[i] != arr2[i]){
System.out.println(i + "..." + arr1[i]);
System.out.println(i + "..." + arr2[i]);
return false;
}
}
return true;
}
/**
* 产生数组用来测试冒泡排序方法
* @return
*/
public static int[] getArr(){
Random random = new Random();
// 若电脑性能有限,生成的数组可以降低长度
int length = random.nextInt(1000);
int[] arr = new int[length];
for(int i = 0; i < length; i++){
arr[i] = random.nextInt();
}
return arr;
}
public static void main(String[] args) {
// 循环测试5万次后,确定刚才写的排序没问题
for (int i = 0; i < 50000; i++) {
int arr1[] = getArr();
int arr2[] = Arrays.copyOf(arr1, arr1.length);
bubbleSort(arr2);
boolean comparator = comparator(arr1, arr2);
if(!comparator){
System.out.println("排序失败");
}
}
System.out.println("排序成功");
}
}