查找算法中的“二分法”是这样定义的:
给定N个从小到大排好序的整数序列List[],以及某待查找整数X,我们的目标是找到X在List中的下标。即若有List[i]=X,则返回i;否则返回-1表示没有找到。
二分法是先找到序列的中点List[M],与X进行比较,若相等则返回中点下标;否则,若List[M]>X,则在左边的子系列中查找X;若List[M]<X,则在右边的子系列中查找X。
试写出算法的伪码描述,并分析最坏、最好情况下的时间、空间复杂度。
给定N个从小到大排好序的整数序列List[],以及某待查找整数X,我们的目标是找到X在List中的下标。即若有List[i]=X,则返回i;否则返回-1表示没有找到。
二分法是先找到序列的中点List[M],与X进行比较,若相等则返回中点下标;否则,若List[M]>X,则在左边的子系列中查找X;若List[M]<X,则在右边的子系列中查找X。
试写出算法的伪码描述,并分析最坏、最好情况下的时间、空间复杂度。
- #include <iostream>
- using namespace std;
- int Search(int X,int N,int List[])
- {
- int start=0,end=N-1,m=(start+end)/2;
- if (X>List[end]||X<List[start])
- return -1;
- while (List[start]!=List[end]) //大的循环体
- {
- if (X==List[m])
- {
- cout<<m<<endl;
- return -1;
- }
- else if(X<List[m])
- {
- end=m-1;
- m=(start+end)/2; //重新定位中点的位置
- }
- else//X>List[m]
- {
- start=m+1;
- m=(start+end)/2;
- }
- }
- while(List[start]==List[end]) //所有数均相等的情况
- {
- if (X==List[start])
- {
- cout<<start<<endl;
- return -1;
- }
- else
- return -1;
- }
- }
- int main()
- {
- int List[]={8,9,12,19,20,51,63,74,82,97};
- Search(63,10,List);
- return 0;
- }