有序数组中查找某个数的下标(顺序查找+二分查找)
1、问题
在一个排好序的数组T[1..n]中查找x
如果x在T中,输出x在T的下标 pos;
如果x不在T中,输出 pos = 0 。
2、解析
顺序查找:
在数组T中一个一个地查找下去,如果找到x就记录下标pos然后退出,如果完整一遍查找下来都没找到输出0。
二分查找:
二分查找适合对已经排序好的数据集合进行查找。主要思想为根据R(右边界)和L(左边界)确定出集合中最中间的mid元素,将数据集合划分为两个子集,将mid元素和关键字key进行比较,如果大于关键字key,则R=mid-1,在前一个数据集合中查找;否则L=mid+1,并在后一个子集中查找,直到L>R为止。因为如果没查找到会一直修改L边界和pos值,所以最后需要特判是否真的找到了。
3、设计
顺序查找:
1 for i <- 1 to 100 2 if T[i]==x//如果找到了元素X,记录它的下标,直接退出 3 pos=i 4 break
二分查找:
1 l <- 1 2 r <- 100 3 while r >= l 4 mid <- (l+r)/2//二分一个中间值mid 5 if T[mid]<=x//如果中间值mid比X小,说明要找的区间在右边,修改l边界 6 l=mid+1 7 pos=mid 8 else r=mid-1//反之,说明要找的区间在左边,修改r边界 9 if T[100]!=x 10 pos=0//因为如果没查找到会一直修改l边界和pos值,所以最后需要特判是否真的找到了
4、分析
顺序查找算法的时间复杂度为 O(n)
二分查找算法的时间复杂度为 O(log(n))
5、源码
https://github.com/ChenyuWu0705/Algorithm-Analyze-and-Design/blob/main/linear%20search.cpp
https://github.com/ChenyuWu0705/Algorithm-Analyze-and-Design/blob/main/Binary%20Search.cpp