數組的冒泡排序和二分法查找

數組冒泡排序

public class ArrayTest01 {
	public static void main(String[] args) {
	int[] arr = {3, 5, 1, 7, 6, 2, 4};
		// 外側循環:用於控制比較的躺數
		for(int i = 0; i < arr.length - 1; i++) {
			// 在每一趟判斷以前,先假設本趟排序已經完成
			boolean flag = true;
			// 內側循環:用於控制每一趟相鄰元素比較的次數
			for(int j = 0; j < arr.length - i - 1; j++) {
				// 相鄰兩個元素作比較,若是前一個大於後一個,則交換位置
				if(arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					// 進入此處,證實本趟排序還未完成,因此推翻假設
					flag = false;
				}
			}
			System.out.print("第" + (i+1) + "次排序:");
			for(int value : arr) {
				System.out.print(value + " ");
			}
			System.out.println();
			// 最後判斷flag標記的值,從而肯定排序是否已經完成
			if(flag) {
				break; // 跳出外側循環
			}
		}
		
		System.out.print("排序完成:");
		for(int value : arr) {
			System.out.print(value + " ");
		}
    }
}

冒泡排序java

工做原理:重複地走訪過要排序的數列,一次比較兩個元素,若是他們的順序錯誤就把他們交換過來。走訪數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。算法

這個算法的名字由來是由於越大的元素會經由交換慢慢「浮」到數列的頂端,故名。數組

ublic class ArrayTest02 {
	public static void main(String[] args) {
		int[] arr = {3, 5, 1, 7, 6, 2, 4};
		sort(arr);
		System.out.print("排序完成:");
		for(int value : arr) {
			System.out.print(value + " ");
		}
	}
	
	/**
	 * 冒泡排序(升序)
	 * @param arr 須要排序的數組
	 */
	public static void sort(int[] arr) {
		// 外側循環:用於控制比較的躺數
		for(int i = 0; i < arr.length - 1; i++) {
			// 在每一趟判斷以前,先假設本趟排序已經完成
			boolean flag = true;
			// 內側循環:用於控制每一趟相鄰元素比較的次數
			for(int j = 0; j < arr.length - i - 1; j++) {
				// 相鄰兩個元素作比較,若是前一個大於後一個,則交換位置
				if(arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					// 進入此處,證實本趟排序還未完成,因此推翻假設
					flag = false;
				}
			}
			// 最後判斷flag標記的值,從而肯定排序是否已經完成
			if(flag) {
				break; // 跳出外側循環
			}
		}
	}
}

二分法查找

二分查找又稱折半查找性能

優勢:比較次數少,查找速度快,平均性能好;code

缺點:是要求待查表爲有序表,且插入刪除困難。blog

所以,折半查找方法適用於不常常變更而查找頻繁的有序列表。排序

前提:必須是有序的數組。索引

例題:獲取元素12在數組{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20}中的索引。class

public class ArrayTest03 {
	public static void main(String[] args) {
		int[] arr = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
		// 定義須要查找的元素
		int value = 12;
		int index = binarySearch(arr, value);
		System.out.println(index);
	}
	/**
	 * 折半查找
	 * @param arr 須要查找的數組
	 * @param value 須要查找的元素
	 * @return 返回查找到的元素索引,若是沒找到則返回-1
	 */
	public static int binarySearch(int[] arr, int value) {
		// 定義三個變量
		int min = 0, max = arr.length - 1, mid;
		// 經過死循環執行二分查找
		while (true) {
			// 更新mid的值
			mid = (min + max) / 2;
			// 判斷arr[mid]和value的值
			if (arr[mid] > value) {
				max = mid - 1;
			} else if (arr[mid] < value) {
				min = mid + 1;
			} else {
				return mid;
			}
			// 若是max小於min,則證實value在數組中不存在
			if (max < min) {
				return -1;
			}
		}
	}
}
相關文章
相關標籤/搜索