【百度百科】https://baike.baidu.com/item/冒泡排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,一次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
import java.util.Arrays;
public class BubbleSort_02 {
//主函数
public static void main(String[] args) {
int arr2[] = {3, 2, 5, 7, 2, 5};
BubbleSort_02 sorter1 = new BubbleSort_02();
sorter1.sort(arr2);
}
// 冒泡排序函数:O(N的平方)
//排除非空数组与包含1个数字的数组
//每一轮中把最大的数组放在最后面,
//大循环:1~N中,对比相邻的每个数字,小循环:把大的数组放后面 swap()
//打印出来 showArray(arr)
public static void sort(int[] arr) {
if (arr == null || arr.length < 2) {
// System.out.print("Wrong array!");
return;
}
for (int e = arr.length-1; e > 0; e--) {
for (int i=0; i < e; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i+1);
}
}
}
showArray(arr);
}
// 交换数组相邻两个值
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// 打印显示函数
public static void showArray(int[] array) {
// for (int i : array) {
// System.out.print(" " + i);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
}
【对数器】:用于算法的验证
//实现对数器
// 1) 先生成随机长度,里面数字随机的数组 -> 随机数组发生器
public static int[] generateRandomArray(int size, int value) {
// Math.random() -> double [0, 1)
// (int)((size + 1) * Math.random()) -> [0, size]整数
//上面这行是,把属于[0,1)的数字,乘以size,在(int)转换。
// 举例:[0,1) * 10 -> 最多9.8, 9.9 -> (int)后就剩9了, -> [0, 9] 完美
// 最多就是size这个长度,上一行 size=9
int[] arr = new int[(int) ((size + 1) * Math.random())]; // 长度随机
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((value + 1) * Math.random()) - (int)(value * Math.random());// 值随机产出,这里可以产生负数
}
return arr;
}
// 2)要准备一个绝对正确的方法 —> 调用系统绝对正确的排序方法
public static void rightMathod(int[] arr) {
Arrays.sort(arr);
}
// 3) 大样本测试,
public static void main1(String[] args) {
int testTime = 500000; // 测试次数
int size = 10; // 随机数组长度
int value = 100;// 随机值的范围
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(size, value);
int[] arr2 = copyArray(arr1);
int[] arr3 = copyArray(arr1);
sort(arr1); // 自己写的排序方法
rightMathod(arr2); // 绝对正确的排序方法
if (!isEqual(arr1, arr2)) {
succeed = false;
printArray(arr3);
break;
}
}
System.out.println(succeed ? "Nice" : "Oh No!");
}
// 拷贝数组
public static int[] copyArray(int[] arr) {
if (arr == null) {
return null
}
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
// 验证数组是否相等的方法
public static boolean isEqual (int[] arr1, int[] arr2) {
if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null) ) {
return false;
}
if (arr1 == null && arr2 == null) {
return true;
}
if (arr1.length != arr2.length) {
return false;
}
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i] ) {
return false;
}
}
return true;
}
// 打印出来
public static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
// 准备二叉树的随机样本发生器,数组的随机样本发生器,如果出错了,可以验证。