數組冒泡排序
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; } } } }