三十九、排序與查詢
阿新 • • 發佈:2021-06-29
1、氣泡排序
1.1 概述
氣泡排序:將一組資料按照升序規則進行排列
氣泡排序原理:相鄰的資料兩兩比較,小的放前面,大的放後面
注意:
- 如果有n個數據進行排序,總共需要比較n-1次
- 每一次比較完成,下一次的比較就會少一個數據參與
1.2 氣泡排序圖解
1.3 程式碼實現
public class ArrayDemo { public static void main(String[] args) { //定義一個數組 int[] arr = {7, 6, 5, 4, 3}; System.out.println("排序前:" + Arrays.toString(arr)); // 這裡減1,是控制每輪比較的次數 for (int x = 0; x < arr.length - 1; x++) { // -1是為了避免索引越界,-x是為了調高比較效率 for (int i = 0; i < arr.length - 1 - x; i++) { if (arr[i] > arr[i + 1]) { int temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } } System.out.println("排序後:" + Arrays.toString(arr)); } }
2、選擇排序
2.1 概述
- 每趟選出陣列 中的最小值,把值放在前面,直至所有資料按照要求完成排序
- 如果有n個數據進行排序,總共需要比較n-1次
- 每一次比較完畢,下一次的比較就會少一個數據參與
2.2 選擇排序圖解
2.3 程式碼實現
public class ArrayDemo { public static void main(String[] args) { //定義一個數組 int[] arr = {7, 6, 5, 4, 3}; System.out.println("排序前:" + Arrays.toString(arr)); // 這裡減1,是控制比較的輪數 for (int x = 0; x < arr.length - 1; x++) { // 從x+1開始,直到最後一個元素 for (int i = x+1; i < arr.length; i++) { if (arr[x] > arr[i]) { int temp = arr[x]; arr[x] = arr[i]; arr[i] = temp; } } } System.out.println("排序後:" + Arrays.toString(arr)); } }
3、二分查詢
3.1 陣列的二分查詢步驟
- 定義兩個變數,表示要查詢的範圍。預設min = 0 , max = 最大索引
- 迴圈查詢,但是min <= max
- 計算出mid的值
- 判斷mid位置的元素是否為要查詢的元素,如果是直接返回對應索引
- 如果要查詢的值在mid的左半邊,那麼min值不變,max = mid -1.繼續下次迴圈查詢
- 如果要查詢的值在mid的右半邊,那麼max值不變,min = mid + 1.繼續下次迴圈查詢
- 當 min >= max 時,表示要查詢的元素在陣列中不存在,返回-1.
3.2 二分查詢圖解
假設有一個給定有序陣列(10,14,21,38,45,47,53,81,87,99),要查詢50出現的索引
則查詢過程如下圖所示:
3.3 二分查詢程式碼實現
public static void main(String[] args) {
int[] arr = {10, 14, 21, 38, 45, 47, 53, 81, 87, 99};
int index = binarySerach(arr, 38);
System.out.println(index);
}
/**
* 二分查詢方法
* @param arr 查詢的目標陣列
* @param number 查詢的目標值
* @return 找到的索引,如果沒有找到返回-1
*/
public static int binarySerach(int[] arr, int number) {
int start = 0;
int end = arr.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (number == arr[mid]) {
return mid ;
} else if (number < arr[mid]) {
end = mid - 1;
} else if (number > arr[mid]) {
start = mid + 1;
}
}
return -1; //如果陣列中有這個元素,則返回
}