算法
????????????????????????算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表著用系統的方法描述
解決問題的策略
機制。
查找算法
基本查找(順序查找)
關鍵:
? ? ? ? ? ? ? ? ? ? ? ? 從0索引開始依次向后查找
方法:
public static boolean basicSearch(int[] arr,int number) {//基本查找 遍歷數組查找所需結果for (int i = 0; i < arr.length; i++) {if(number == arr[i]){return true;}}return false;}}
二分查找(折半查找)
關鍵:
? ? ? ? ? ? ? ? ? ? ? ? 數組中的數據是有序的
? ? ? ? ? ? ? ? ? ? ? ? 每次排除一半的查找范圍,節省查找次數
方法:
public static int BinarySearch(int[] arr,int number) {//定義變量確定查找范圍 最小肯定是0索引的int min = 0;//最大的索引是數組長度-1int max = arr.length-1;//開始循環查找數據,利用while循環,查找出索引直接返回結果while(true){if(min > max){//返回-1,調用時可以將-1與0作比較,得出數據索引是否存在return -1;}//中間位置int mid = (min + max) / 2;//arr[mid]>numberif(arr[mid]>number){max = mid - 1;}//arr[mid]<numberelse if(arr[mid]<number){min = mid + 1;}else{return mid;}}}
分塊查找
關鍵:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 塊內無序,塊間有序。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一般分塊是按照數組長度的開根號
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 具體問題,具體分析?
方法:
//判斷number在哪個塊中private static int findIndexBlock(Block[] bArr,int number){//循環判斷number在哪個塊中for (int i = 0; i < bArr.length; i++) {if(number <= bArr[i].getMax()){return i;}}return -1;}
//利用分塊查找獲取索引private static int getIndex(Block[] bArr,int[] arr,int number){int indexBlock = findIndexBlock(bArr,number);//數據不在數組中if(indexBlock == -1){return -1;}//數據在數組中 剛才獲取了數據所屬塊的索引int startIndex = bArr[indexBlock].getStartIndex();int endIndex = bArr[indexBlock].getEndIndex();//遍歷for (int i = startIndex; i <= endIndex; i++) {if(arr[i] == number){return i;}}return -1;}
?排序算法
冒泡排序
關鍵:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 將相鄰的數據進行比較,小的放前面,大的放后面。
方法:
for(int i = 0; i < arr.length - 1; i++){for (int j = 0; j < arr.length - 1-i; j++) {if (arr[j] > arr[j + 1]) {int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}