java_Basic_BubbleSort 排序 & 对数器

【百度百科】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();
	}
	
}

// 准备二叉树的随机样本发生器,数组的随机样本发生器,如果出错了,可以验证。

猜你喜欢

转载自blog.csdn.net/sinat_15355869/article/details/81260372