Java基礎–基本算法
JAVA主要作爲一個後端語言,對邏輯和基本算法的要求是明顯高於前端程序員的(個人認爲),所以大家平常邏輯性不太好的就需要多多複習和學習來提高自己的水平。
1.冒泡排序(優化排序)
冒泡排序是最常用的排序算法,再筆試中也非常常見,能手寫出冒泡排序可以說是基本的素養。
算法重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來,這樣越大的元素會經由交換慢慢的“浮”到數列的頂端。
冒泡排序算法的運作如下:
- 比較相鄰的元素,如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾最後一對,在這一點,最後的元素回事最大的數。
- 針對所欲的元素重複以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重複上面的步驟,知道沒有任何一對數字需要比較。
代碼演示
import java.util.Arrays;
public class Test1 {
public static void main(String[] args) {
int[] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5, 8 };
bubbleSort(values);
System.out.println(Arrays.toString(values));
}
public static void bubbleSort(int[] values) {
int temp;
int i;
// 外層循環:n個元素排序,則至多需要n-1趟循環
for (i = 0; i < values.length - 1; i++) {
// 定義一個布爾類型的變量,標記數組是否已達到有序狀態
boolean flag = true;
/*內層循環:每一趟循環都從數列的前兩個元素開始進行比較,比較到無序數組的最後*/
for (int j = 0; j < values.length - 1 - i; j++) {
// 如果前一個元素大於後一個元素,則交換兩元素的值;
if (values[j] > values[j + 1]) {
temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
//本趟發生了交換,表明該數組在本趟處於無序狀態,需要繼續比較;
flag = false;
}
}
//根據標記量的值判斷數組是否有序,如果有序,則退出;無序,則繼續循環。
if (flag) {
break;
}
}
}
}
2.二分法查找(折半檢索)
二分法檢索又稱折半檢索,二分法檢索的基本思想是設數組中的元素從小到大有序地存放在數組中,首先給定值key與數組中間位置上元素的關鍵碼key進行比較,如果相等,則檢索成功;
否則,若key小,則在數組前半部分中繼續進行二分法檢索;
若key大,則在數組後半部分中繼續進行二分法檢索。
這樣,經過一次比較就縮小一半的檢索區間,如此進行下去,直到檢索成功或檢索失敗。
代碼示例
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] arr = { 30,20,50,10,80,9,7,12,100,40,8};
int searchWord = 20; // 所要查找的數
Arrays.sort(arr); //二分法查找之前,一定要對數組元素排序
System.out.println(Arrays.toString(arr));
System.out.println(searchWord+"元素的索引:"+binarySearch(arr,searchWord));
}
public static int binarySearch(int[] array, int value){
int low = 0;
int high = array.length - 1;
while(low <= high){
int middle = (low + high) / 2;
if(value == array[middle]){
return middle; //返回查詢到的索引位置
}
if(value > array[middle]){
low = middle + 1;
}
if(value < array[middle]){
high = middle - 1;
}
}
return -1; //上面循環完畢,說明未找到,返回-1
}
}
注意:
- 二分法檢索前一定要對數組進行排序。
- 如果數組中有兩個重複的數,基礎二分法查找將不準確。
//各位大佬手下留 贊👍