Java陣列中陣列的運用與陣列排序、折半查詢
阿新 • • 發佈:2019-02-10
注: array.length 代表陣列長度 length代表的就是長度
陣列的運用
1.通過角標 查詢對應的元素
例如:封裝一個函式 傳入數字1 返回 一 數字2 返回二...
public static void main(String[] args) {
System.out.println(fun(3));
}
public static char fun(int index) {//定義一個函式(方法)
char[] array = new char[] {'一', '二', '三', '四', '五'};//定義一個數組
// 按角標返回對應的字元
return array[index - 1];
//由於 陣列的角標是從0開始的
如果不減1 那麼傳入一個1 返回的可能就是二 了
}
2.通過元素 查詢該元素在陣列中的位置(角標)
例如:
封裝一個函式 定義一個數組 陣列值
分別為 3,6,11,22
傳入11
查詢對應的位置
public static void main(String[] args) {
int[] array = new int[] {3, 6, 11 , 22};//定義一個數組
int index = fun(22, array);//定義一個變數 接收這個方法
System.out.println(index);//輸出角標為多少
}
//為了讓方法的使用性更強,可以把陣列也當引數傳進來
public static int fun(int index, int[] array) {//定義一個有引數 有返回值的函式
//定義變數 儲存角標
int a = -1;
for (int i = 0; i < array.length; i++) { //遍歷查詢 元素對應角標
//有可能你傳入的值 不在陣列中 可能會沒有返回值
if (array[i] == index) {
//如果找到對應的值 就儲存一下
a = i;
}
}
return a;//返回一個a
}
陣列元素的反轉
陣列元素的反轉 也就是 將陣列中的值 倒過來
例如:
1 2 3 4 5 反轉成為 5 4 3 2 1
如果要將陣列中的值倒過來 那麼就代表
第一個值和最後一個換
第二個值和倒數第二個換
第三個值和倒數第三個換
...
也就是
array[0] 和 array[length - 1] 換
array[1] 和 array[length - 1 - 1] 換
array[2] 和 array[length - -1 - 2] 換
從這裡我們分析出:
array[i] 和 array[length - 1 - i]換
那麼換幾次呢?
例如 1 2 3 4 5
1 和 5 換
2 和 4 換
例如 1 2 3 4 5 6 7
1 和 7 換
2 和 6 換
3 和 5 換
從而得出 需要交換 length / 2 整數次
那麼 如何交換
這時 我們可以利用中間值來交換
例如:
//交換兩個整數
int a = 5;
int b = 10;
int mid = 0;
mid = a;
a = b;
b = mid
來達到交換的目的
例如:
反轉陣列 1 2 3 4 5
public static void main(String[] args) {
int[] array = new int[] {1, 2, 3, 4, 5};//定義陣列
//這裡做的是一個 地址 的傳遞
reverse(array);
//遍歷陣列的方法
System.out.println(Arrays.toString(array));//列印陣列的方法
}
public static void reverse(int[] array1) {
//交換的次數
int num = array1.length / 2;
for (int i = 0; i < num; i++) {//遍歷查詢
//陣列元素 交換
int temp = 0;
temp = array1[i];
array1[i] = array1[array1.length - 1 - i];
array1[array1.length - 1 - i] = temp;
}
}
那麼 可以用方法反轉陣列 可不可以用方法反轉整數呢?
例如:
public static void main(String[] args) {
int x = 10;
int y = 5;
// 這裡做的是 一個 值 的傳遞
reverseNum(x, y);
System.out.println("x = " + x);
System.out.println("y = " + y);
}
public static void reverseNum(int a, int b) {
int temp = a;
a = b;
b = temp;
}
將這段程式碼輸入並執行時 發現並不能反轉
因為陣列儲存的是一個地址 main函式中定義的地址
而reverse(array)這一步代表
將main函式中陣列的地址 轉遞給 reverse 方法
所以 main函式 和reverse 可以呼叫相同地址的陣列
所以可以進行反轉
而reverseNum這個方法中 並沒有什麼可以和main函式共同使用的
當 reverseNum 這個方法呼叫完以後 就出棧了
然後再繼續進行main函式的呼叫
所以這兩個整數 並不能反轉
陣列排序之氣泡排序
氣泡排序其實就是按照什麼思想去排序(例如:升序或者降序)
核心排序思想: 相鄰兩個數 進行比較 交換位置
例如:
一個數組中的元素為: 3 2 5 1
將這個陣列進行氣泡排序
因為是相鄰兩個數 進行比較 交換
也就是說
第一次 2 3 5 1 第一個和第二個比較後 交換
第二次 2 3 5 1 第二個和第三個比較 這時第二個已經被交換 變成 3 而 3 < 5 所以不交換
第三次 2 3 1 5 第三個和第四個比較 這時已經確定了一個最大值 而且放到了陣列的最後
但是這時陣列還沒有完成比較 交換 我們稱 上面的步驟為 第一趟
那麼 第二趟:
第一次 2 3 1 5 第一個和第二個比較 2 < 3 所以不交換
第二次 2 1 3 5 第二個和第三個比較 3 > 1 所以交換
由於 5 已經確定為最大值 所以 第三個和第四個已經不用比較
這時也確定了倒數第二大的數放在倒數第二個位置
第三趟
第一次 1 2 3 5 第一個和第二個比較 2 > 1 所以交換
這時也確定了倒數第三大的數放在倒數第三個位置
例如:
將陣列 3 5 4 7 1 9 2 8 進行氣泡排序
public static void main(String[] args) {
int temp = 0;
int[] array = new int[] {3, 5, 4, 7, 1, 9, 2, 8};
// 1.把雙層迴圈結構搭出來
// 注意 內迴圈 -1 防止陣列越界
// 外迴圈 - 1 代表比較陣列長度 - 1 趟 (5個數 比較4趟)
// 內迴圈 - i 相當於 每一趟 都少比一次
// 外迴圈 相當於 比較多少趟
// 內迴圈 相當於 一趟 比較多少次
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - 1 - i; j++) {
// 2.相鄰 兩個數比較 交換
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
// 列印陣列的方法
System.out.println(Arrays.toString(array));
}
陣列排序之選擇排序
選擇排序核心思想:
選擇一個數 依次和後面的數 比較 換位(一般選擇第一個數)
例如:
將陣列 3 5 1 4 進行選擇排序
第一趟
第一次 3 5 1 4 第一個和第二個比
第二次 1 5 3 4 第一個和第三個比
第三次 1 5 3 4 第一個和第四個比
確定了最小值在第一位
第二趟
第一次 1 3 5 4 第二個和第三個比
第二次 1 3 5 4 第二個和第四個比
確定了第二小在第二位
第三趟 1 3 4 5 第三個和第四個比
確定第三小在第三位
public static void main(String[] args) {
int[] array = new int[] {3, 5, 1, 4};//定義一個數組
int temp = 0;//定義一個變數 用於 元素交換
for (int i = 0; i < array.length - 1; i++) {
for (int j = i + 1; j < array.length; j++) {
//外迴圈 - 1 相當於 比較 長度 - 1 趟(5個數 就比較 4 趟)
//內迴圈 1 + i 相當於 把不需要比較的去除 (array[0] 和 array[0])
// 每一次 確定一個數
if (array[i] > array[j]) {//由於
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
System.out.println(Arrays.toString(array));
}
折半查詢
折半查詢的前提是 :
在一個有序的陣列中查詢 一個數在陣列中的角標
注意: 要在有序的陣列中 查詢
例如:
查詢 陣列元素為 3 5 6 9 12 18 22 33 55 中22的角標
public static void main(String[] args) {
int[] array = new int[] {3 , 5, 6, 9, 12, 18, 22, 33, 55};
// 把 要用到的變數 全部宣告一遍
// 宣告最大 最小 中間角標
int min = 0;//最小角標
int max = array.length - 1;//最大角標 由於角標從0開始 所以最大角標是長度 -1
int mid = (array.length - 1) / 2;
// 要查詢的值
int key = 22;
/*
* 迴圈查詢
* array[mid] != key
*/
while (key != array[mid]) {
//比較 如果比中間角標大 挪動 最小角標
// 如果比中間角標小 挪動 最大角標
if (key > array[mid]) {
min = mid + 1;
}else if (key < array[mid]) {
max = mid - 1;
}
// 挪動完角標後 還要進行折半操作
mid = (min + max) / 2;
//當最大角標 小於 最小角標的時候 說明 陣列中 沒有這個數
if (max < min) {
//進到這裡 說明 沒這個數 就停止迴圈
mid = -1;
break;
}
}
System.out.println("這個數的角標是: " + mid );
}
Day.3