当前位置:   article > 正文

二分查找——递归+非递归实现(c语言)_二分查找的非递归实现

二分查找的非递归实现

要求:

给定n个从小到大排好序的整数序列Data[]以及待查找整数X,找到X在Data[]中的下标

若Data[i]=X,则返回i,否则返回失败标志NotFound

二分法:

现在找到序列的中点Data[Mid],与X进行比较

若相等则返回中点下标Mid

若X<Data[Mid] ,则在左边的子序列中查找X

若X>Data[Mid],则在右边的子序列中查找X

递归实现代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define NotFound -1
  4. #define MAXSIZE 100
  5. //线性表的定义 (顺序存储)
  6. typedef int Position;
  7. typedef int ElementType;
  8. typedef struct LNode *List;
  9. struct LNode{
  10. ElementType Data[MAXSIZE];
  11. Position Last;//保证数组Data[]中最后一个元素的位置
  12. };
  13. //函数接口
  14. Position BS(List L,ElementType X,Position Left,Position Right);
  15. Position BinarySearch(List L,ElementType X);
  16. //递归实现
  17. //T(N)=O(logN) ,S(N)=O(logN)
  18. Position BS(List L,ElementType X,Position Left,Position Right){
  19. //left和right 为当前要处理的L->Data[]中最左和最右的下标值
  20. if(Left>Right)//当前范围内没有元素了
  21. return NotFound;
  22. int Mid=(Left+Right)/2;
  23. if(X<L->Data [Mid])
  24. return BS(L,X,Left,Mid-1);//调整有边界
  25. else if(X>L->Data [Mid])
  26. return BS(L,X,Mid+1,Right); //调整左边界
  27. else
  28. return Mid; //找到了,返回数组元素的下标
  29. }
  30. Position BinarySearch(List L,ElementType X){
  31. return BS(L,X,1,L->Last);
  32. }
  33. List MakeEmpty()
  34. {
  35. List L;
  36. L=(List)malloc(sizeof(struct LNode));
  37. L->Last =-1;
  38. return L;
  39. }
  40. int main()
  41. {
  42. //初始化
  43. List L=MakeEmpty();
  44. int i;
  45. ElementType X;
  46. //输入
  47. printf("请输入10个元素:\n");
  48. for(i=0;i<10;i++){
  49. scanf("%d",&L->Data[i]);
  50. L->Last ++;
  51. }
  52. //二分查找
  53. printf ("请输入需要查找的元素:\n");
  54. scanf("%d",&X);
  55. Position p=BinarySearch(L,X);
  56. printf("%d在数组中的下标为%d\n",X,p);
  57. return 0;
  58. }

非递归实现代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define NotFound -1
  4. #define MAXSIZE 100
  5. //线性表的定义 (顺序存储)
  6. typedef int Position;
  7. typedef int ElementType;
  8. typedef struct LNode *List;
  9. struct LNode{
  10. ElementType Data[MAXSIZE];
  11. Position Last;//保证数组Data[]中最后一个元素的位置
  12. };
  13. //函数接口
  14. Position BinarySearch(List L,ElementType X);
  15. //非递归实现
  16. //T(N)=O(logN) ,S(N)=O(1)
  17. Position BinarySearch(List L,ElementType X){
  18. Position Left,Right,Mid;
  19. Left=1; //初始左边界下标值
  20. Right=L->Last ;//初始右边界下标值
  21. while(Left<=Right){
  22. Mid=(Left+Right)/2;//计算中间元素坐标
  23. if(X<L->Data [Mid])
  24. Right=Mid-1;//调整右边界
  25. else if(X>L->Data [Mid])
  26. Left=Mid+1;//调整左边界
  27. else
  28. return Mid; //找到了,返回数组元素的下标
  29. }
  30. return NotFound;//没找到,返回不成功的标志
  31. }
  32. List MakeEmpty()
  33. {
  34. List L;
  35. L=(List)malloc(sizeof(struct LNode));
  36. L->Last =-1;
  37. return L;
  38. }
  39. int main()
  40. {
  41. //初始化
  42. List L=MakeEmpty();
  43. int i;
  44. ElementType X;
  45. //输入
  46. printf("请输入10个元素:\n");
  47. for(i=0;i<10;i++){
  48. scanf("%d",&L->Data[i]);
  49. L->Last ++;
  50. }
  51. //二分查找
  52. printf ("请输入需要查找的元素:\n");
  53. scanf("%d",&X);
  54. Position p=BinarySearch(L,X);
  55. printf("%d在数组中的下标为%d\n",X,p);
  56. return 0;
  57. }

运行:

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号