常見查找算法
線性表的查找:
//順序查找
//如果找到,返回數組下標;
//時間復雜度O(n);
class Solution{
public int seqSearch(int[] a,int key){
for (int i=0; i<a.length; i++){
if (a[i]==key)
return i;
}
return -1;
}
public static void main(String args[]){
int a[]={5,6,8,2,4,0};
Solution s = new Solution();
int k = s.SeqSearch(a,0);
}
}
//折半查找, 又叫二分查找
//前提條件是需要有序表順序存儲;對於靜態查找表,一次排序後不再變化,折半查找能得到不錯的效率。但對於需要頻繁執行插入或刪除操作的數據集來說,維護有序的排序會帶來不小的工作量,那就不建議使用;
//適用於不經常變動而查找頻繁的有序列表;
//時間復雜度是O(logn);
**非遞歸實現**
class Solution{
public int Search_Bin(int[] a,int key){
int low=0;
int high=a.length-1;
while(low<=high){
if(a[mid]>key)
high=mid-1;
else if(a[mid]<key)
low=mid+1;
else return mid;
}
return -1;
}
public static void main(String args[]){
int a[]={1,3,4,5,7,9};
Solution s = new Solution();
int k = s.Search_Bin(a,7);
System.out.println("下標="+k);
}
}
**遞歸實現**
//使用遞歸時,方法參數需要攜帶諸如 left,right;start,end;low,high;
public int Search_Bin(int[] a, int left, int right, int target){
int mid = (left + right)/2;
int midValue = a[mid];
if (left<=right) {
if (midValue>target) {
return Search_Bin(a, left, mid-1, target);
}else if(midValue<target){
return Search_Bin(a, mid+1, right, target);
}else
return mid;
}
return -1;
}
常見查找算法