问题:在有序的数组中搜索
给定一个包含n的数组E,并给定一个值K,请找到 K=E[index]的一个索引,如果K不在数组中,则返回-1作为答案

策略A
输入数据和数据结构:无排序数组
顺序搜索

算法A
int seqSearch(int[] E, int n, int K)

分析A
W(n) = n
A(n) = q [(n+1)/2] + (1-q) n

优化A
用于搜索未排序的数组
F (n) = n
算法A是最优的。

策略B
输入数据和数据结构:按非递减顺序排序的数组
顺序搜索

算法B
int seqSearch(int[] E , int n , int K)

分析 B
W (n) = n
A (n)=q [(n +1)/2]+ (1 - q) n

B的优化
它没有利用条目是有序的这一事实 我们能否修改算法,使其减少工作?

策略C
输入数据:以非递减顺序排序的数组 顺序搜索。
一旦遇到大于K的数组,算法就可以终止,答案是-1

int seqSearchMod(int[] E, int n, int K)
 int ans, index;
 ans =1; // Assume failure.
 for (index = 0; index < n; index++)
     if (K > E[index])
         continue;
     if (K < E[index])
         break; // Done!
     // K == E[index]
     ans = index; // Find it
     break;
 return ans;

策略D
首先将K与数组中间的条目进行比较
通过一次比较消除一半的条目
递归地应用同样的策略

算法D:二分法搜索
输入:E,first,last和K,都是整数,其中E是一个有序的数组,范围是first,...,last,而K是要寻找的

输出:索引,如果K在E的first, ..., last范围内,则E[索引]=K;如果K不在E的这个范围内,则索引=-1。

int binarySearch(int[] E, int first, int last, int K)
  if (last < first)
       index = -1;
  else
      int mid = (first + last)/2
      if (K == E[mid])
         index = mid;
      else if (K < E[mid])
         index = binarySearch(E, first, mid-1, K)
      else
       index = binarySearch(E, mid+1, last, K);
 return index
最后修改:2022 年 04 月 17 日
如果觉得我的文章对你有用,请随意赞赏