查找算法
一、顺序查找(Linear Search)
顺序查找,利用朴素的想法,简单的从数组头开始搜索希望找到的元素。算法逻辑可以概括为:
从数组的第一个元素开始,依次往下比较,直到找到要找的元素为止。
用一个简单的程序举例
int main(){
  int  k, x;
  int array[] = {2, 3, 1, 7, 5, 8, 9, 0, 4, 6};
  cout << "请输入要查找的元素值:"; 
  cin >> x;
  for (k = 0; k < 10; ++k){
      if(x == array[k]) {
          cout << k;
          break;
      }
      if(k == 10) 
          cout << "not found";
  }
  return 0;
}
二、二分查找
二分查找要求数组元素按照某一顺序排序,如数字的大小顺序、字母的字母序等。一般在查字典的时候,就会使用类似二分查找的思想。二分查找的基本步骤有三步:
- 确定上下界:lh, rh 
- 找出中间元素的位置:mid = ( lh + rh ) / 2 
- 比较中间元素与欲查找的元素 key,根据不同情况进入不同分支继续处理 - 如key 等于中间元素,则mid就是要查找的元素的位置 
- 如key >中间元素,则从lh–mid的这些元素不可能是要查找的元素,修正查找范围为lh= mid + 1到rh 
- 如key <中间元素,则从mid - rh的这些元素不可能是要查找的元素,修正查找范围为lh到rh = mid - 1 
- 如lh > rh,则要查找的元素不存在 
 
int main() {
    int lh, rh, mid, x; 
    int array[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 
    cout << "请输入要查找的数据:"; 
    cin >> x; 
    lh = 0; rh = 9; 
    while ( lh <= rh ) { 
    	mid = ( lh + rh ) / 2; 
    	if ( x== array[mid] ) { 
    		cout << x << "的位置是:" << mid << endl; 
    		break; 
        } 
        if ( x < array[mid]) rh = mid - 1; 
        else lh = mid + 1; 
    } 
    if (lh > rh) cout << "没有找到" << endl; 
    return 0; 
}
算法性能
显然二分查找的效率比顺序查找要高,二分查找在最坏情况下查找次数为log2N+1次,而顺序查找最坏情况查找次数则为N次。但二分查找只能对已排序数组操作,这是其局限性。