Java陣列之反轉、排序、折半查詢
阿新 • • 發佈:2019-02-09
陣列的運用
1.通過角標查詢對應的元素
需求: 封裝一個函式 傳入數字1 返回 一 數字2 返回 二....
// 查表法
public static char findArray(int a) {
char[] array = new char[] {'一', '二', '三', '四', '五'};
// 按角標 返回對應字元
return array[a - 1];
}
public static void main(String[] args) {
System.out.println(fun(1 ));
}
2.通過元素查詢該元素在陣列中得位置(角標)
需求:封裝一個函式 定義一個數組 陣列值分別 3,6,11,22,查詢22的角標
// 為了讓方法的使用性更強,可以把陣列也當引數傳進來
public static int fun(int a, int[] array) {
int l = -1;
// 遍歷查詢 元素對應角標
for(int i=0; i < array.length; i++) {
// 有可能你傳入的值不在陣列中,可能會沒有返回值
if(array[i] == a) {
l = i;
}
}
return l;
}
public static void main(String[] args) {
int[] array = new int[] {3, 6, 11, 22};
System.out.println(fun(22,array));
}
陣列元素反轉
如何交換?
例如: 需求 交換兩個整數
int a = 10;
int b = 15;
int temp = 0;
temp = a;
a = b;
b = temp;
陣列元素反轉(即將陣列中的值倒過來)
分析:
1.換 length/2 整數次
2.第一個數和最後一個數換 一次換...
如:
array[0] 和 array[length - 1 - 0]
array[1] 和 array[length - 1 - 1]
array[2] 和 array[length - 1 - 2]
...
結論:array[i] 和 array[length -1 -i] 相互交換
例: 定義一個長度為5的陣列,並將陣列元素反轉
public static void reverse(int[] array) {
for(int i = 0; i < array.length / 2; i++) {
// 陣列元素交換
int temp = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = temp;
}
System.out.println(Arrays.toString(array));
}
public static void main(String[] args) {
int[] array = new int[] {1, 2, 3, 4, 5};
// 這裡做的是一個地址的傳遞
reverse(array);
}
寫一個交換兩個整數的方法,無法實現交換,是因為做的只是一個值的快遞,並沒有給main函式地址,如:
public static void reverseNum(int a, int b) {
int temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
int a = 10;
int b = 15;
// 這裡做的是一個 值的傳遞
reverseNum(a, b);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
陣列排序
氣泡排序
氣泡排序核心思想:相鄰兩個數進行比較,交換位置
分析:
int[] array = new int[]{3, 2, 5, 1}
3 2 5 1
第一趟 比較完畢,確定一個最大值,放到最後
第一次:2 3 5 1
第二次:2 3 5 1
第三次:2 3 1 5
length - 1 - 0
第二趟
比較完畢,確定一個最大值,放到最後
第一次:2 3 1 5
第二次:2 1 3 5
length - 1 - 1
第三趟
比較完畢,確定一個最大值,放到最後
第一次:1 2 3 5
length - 1 - 2
例項:
int[] array = new int[] {3, 2, 5, 1}
// 外迴圈相當於比較多少趟,-1代表比較陣列長度-1趟
for(int i = 0; i < array.length - 1; i++) {
// 內迴圈相當於一趟比較多少次,-i相當於每趟都少比一次(注意內迴圈-1 防止陣列越界)
for(int j = 0; j < array.length - 1 - i; j++) {
if(array[j] > array[j+1]) {
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(array));
選擇排序
選擇排序的核心思想:選擇一個數,一次和後面的數比較 換位
分析:
array[0] --- array[1] array[2] array[3]
array[1] --- array[2] array[3]
array[2] --- array[3]
例項:
int[] array = new int[] {3, 2, 1, 5};
// 外迴圈 -1 相當於 比較長度-1趟
for (int i = 0; i < array.length -1; i++) {
// 內迴圈 1+i把不需要比較的去除 array[0] 和 array[0]
for (int j = i + 1; j < array.length; j++) {
if(array[i] > array[j]) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
System.out.println(Arrays.toString(array));
折半查詢(提高效率的查詢)
折半查詢前提:在陣列中查詢,查詢這個數在陣列中得角標
注意:在有序的陣列中查詢
例: 查詢陣列 int[] array = new int[]{3,5,6,9,12,18,22,33} 22的角標
int[] array = new int[]{3, 5, 6, 9, 12, 18, 22, 33};
// 宣告最大 最小 中間 角標
int min = 0;
int max = array.length - 1;
int mid = (max + min) / 2;
// 要查詢的值
int key = 22;
// 迴圈結束條件 key == array[mid]
while(key != array[mid]) {
// 比較 如果比中間角標大 挪動小角標
// 比較 如果比中間角標小 挪動大角標
if(key > array[mid]) {
min = mid + 1;
} else if(key < array[mid]) {
max = mid - 1;
}
// 挪動完角標後 還要進行折半操作
mid = (max + min) / 2;
// 當最大角標小於最小角標的時候,說明陣列中沒有這個數
if(max < min) {
// 進到這裡說明沒有這個數,停止迴圈
mid = -1;
break;
}
}
System.out.println("這個數的角標是:" + mid);