二分查詢和優化氣泡排序
阿新 • • 發佈:2021-10-19
何為二分查詢
1,前提:有已排序陣列 A (假設已經做好)
2.定義左邊界 L 、右邊界 R ,確定搜尋範圍,迴圈執行二分查詢(3、4兩步)
3.獲取中間索引 M = Floor (( L + R )/2)
4.中間索引的值 A [ M ] 與待搜尋的值 T 進行比較
① A [ M ]= T 表示找到,返回中間索引
② A [ M ]> T ,中間值右側的其它元素都大於 T ,無需比較,中間索引左邊去找, M - 1設定為右邊界,重新查詢
③ A [ M ]< T ,中間值左側的其它元素都小於 T ,無需比較,中間索引右邊去找, M + 1設定為左邊界,重新查詢
/*** * 2分查詢 */ public class HalfFind { public static void main(String[] args) { int[] arr = {1,11,24,33,45,48,56,68,69,73,77,83,85,90,99,107}; int target = 99; System.out.println(halfFind(arr,target)); } private static String halfFind(int[] arr, int target) {// l:左邊界 r:右邊界 m:中間索引 int l = 0,r = arr.length-1,m; // 記錄查詢次數 int num = 0; // 如果左邊界大於右邊界說明沒有找到資料退出迴圈 while (l <= r) { num++; // m = (l + r) / 2; //使用右移1位 可以解決int最大數值資料溢位問題 不考慮大資料量可以直接使用 m = (l + r) / 2; m = (l + r) >>> 1;if (arr[m] == target) { return "查詢"+num+"次,找到該元素的索引是:"+m; } else if (arr[m] > target) { //說明中間索引右側元素都大於target 右側不用比較 把右邊界改為 m-1 r = m - 1; } else { //說明中間索引左側元素都小於target 左側不用比較 把左邊界改為 m+1 l = m + 1; } } return "查詢"+num+"次,沒有找到該元素!"; } }
/*** * 氣泡排序 */ public class BubbleSort { public static void main(String[] args) { // 原始陣列資料 int[] arr = {7,2,11,30,26,32,46,57}; bubbleSort(arr); } //排序方法 public static void bubbleSort(int[] arr) { // 每次迴圈需要比較的次數 第一次是陣列長度-1 int n = arr.length - 1; while (true) { // 用來記錄最後一次交換的索引的位置 int last = 0; // 每次迴圈最大次數是上一次最後一次交換的索引的位置 for (int i = 0; i < n; i++) { System.out.println("比較次數:"+(i+1)); if (arr[i] > arr[i + 1]) { // 如果前一個元素比後一個元素大交換元素的位置 swap(arr,i,i+1); // 給最後一次交換的索引位置賦值 last = i; } } // 給下次迴圈次數賦值 n = last; System.out.println("排序後陣列:"+ Arrays.toString(arr)); if (n == 0) { // 如果下次迴圈次數是0結束迴圈 break; } } } // 交換陣列位置方法 public static void swap(int[] arr,int i,int j) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }