二分法(算法)

来源:互联网 发布:安徽网络作家 编辑:程序博客网 时间:2024/05/04 09:32

 查找算法中的“二分法”是这样定义的:


      给定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。


      试写出算法的伪码描述,并分析最坏、最好情况下的时间、空间复杂度。



  1. #include <iostream>
  2. using namespace std;


  3. int Search(int X,int N,int List[])
  4. {
  5. int start=0,end=N-1,m=(start+end)/2;
  6. if (X>List[end]||X<List[start])
  7. return -1;
  8. while (List[start]!=List[end])                 //大的循环体
  9. {
  10. if (X==List[m])
  11. {
  12. cout<<m<<endl;
  13. return -1;
  14. }
  15. else if(X<List[m])
  16. {
  17. end=m-1;
  18. m=(start+end)/2;               //重新定位中点的位置
  19. }
  20. else//X>List[m]
  21. {
  22. start=m+1;
  23. m=(start+end)/2;
  24. }
  25. }
  26. while(List[start]==List[end])             //所有数均相等的情况
  27. {
  28. if (X==List[start])
  29. {
  30. cout<<start<<endl;
  31. return -1;
  32. }
  33. else
  34. return -1;
  35. }
  36. }


  37. int main()
  38. {
  39. int List[]={8,9,12,19,20,51,63,74,82,97};
  40. Search(63,10,List);
  41. return 0;
  42. }





0 0