1. 程式人生 > >常見查找算法

常見查找算法

get 建議 turn 需要 idv nbsp else if 靜態查找 列表

線性表的查找:
//順序查找
//如果找到,返回數組下標;
//時間復雜度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);

  System.out.println("下標="+k);
  }
}

//折半查找, 又叫二分查找
//前提條件是需要有序表順序存儲;對於靜態查找表,一次排序後不再變化,折半查找能得到不錯的效率。但對於需要頻繁執行插入或刪除操作的數據集來說,維護有序的排序會帶來不小的工作量,那就不建議使用;
//適用於不經常變動而查找頻繁的有序列表;
//時間復雜度是O(logn);

**非遞歸實現**
class Solution{
public int Search_Bin(int[] a,int key){
  int low=0;
  int high=a.length-1;
  while(low<=high){

    int mid=(low+high)/2;
    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;
}

常見查找算法