查找-折半查找(二分查找)

喜欢ヅ旅行 2022-05-13 08:42 317阅读 0赞

折半查找

折半查找,也称为二分查找。其要求是数据是有序的,即表中元素按关键字有序。

比如有序表是递增有序的。首先取这表中的中间的数据与关键值(给定值key)比较的关系。若key>表的中间值,则说明key存在于表的中间值的右侧。因此,中间值右侧的区间又要取出中间值再与key比较,以此类推,直至查找成功或者区间缩小为0时还找不到就结束。

若key有与表中某区间 的中间值相等,则说明查找成功。

若表的区间缩小为0时,仍然没有找到与key相匹配的值,就说明key不在表中。

特点:只适合用于顺序存储结构,而不适用于链式存储结构。表必须要求是有序表

时间复杂度:

O(log2(n))

折半查找的基本思路:

70

优点:效率高,平均性能好

缺点:插入删除困难

代码:

(1)

  1. #include<stdio.h>
  2. #define MAXL 10
  3. typedef struct
  4. {
  5. int key;
  6. }NodeType;
  7. typedef NodeType SeqList[MAXL];
  8. int BinSearch(SeqList r,int n,int k)
  9. {
  10. int left=0,right=n-1,mid;
  11. printf("\n中间值:");
  12. while(left<=right)
  13. {
  14. mid=(left+right)/2;
  15. printf("%d ",mid);
  16. if(r[mid].key==k)
  17. {
  18. return mid;
  19. }
  20. if(r[mid].key>k)
  21. right=mid-1;
  22. else
  23. left=mid+1;
  24. }
  25. return -1;
  26. }
  27. void main()
  28. {
  29. SeqList r;
  30. int k=7;
  31. int a[10]={0,1,2,3,4,5,6,7,8,9},i,n=10;
  32. for(i=0;i<n;i++)
  33. r[i].key=a[i];
  34. printf("关键字序列:");
  35. for(i=0;i<n;i++)
  36. {
  37. printf("%d ",r[i].key);
  38. }
  39. if((i=BinSearch(r,n,k))!=-1)
  40. printf("\n元素%d的位置是%d\n",k,i);
  41. else
  42. printf("元素%d不在表中\n",k);
  43. }

(2)

  1. #include<stdio.h>
  2. int BinSearch(int arr[],int n,int k)
  3. {
  4. int left=0,right=n-1,mid;
  5. printf("\n中间值:");
  6. while(left<=right)
  7. {
  8. mid=(left+right)/2;
  9. printf("%d ",mid);
  10. if(arr[mid]==k)
  11. {
  12. return mid;
  13. }
  14. if(arr[mid]>k)
  15. right=mid-1;
  16. else
  17. left=mid+1;
  18. }
  19. return -1;
  20. }
  21. void main()
  22. {
  23. int k=7;
  24. int a[10]={0,1,2,3,4,5,6,7,8,9},i,n=10;
  25. printf("关键字序列:");
  26. for(i=0;i<n;i++)
  27. {
  28. printf("%d ",a[i]);
  29. }
  30. if((i=BinSearch(a,n,k))!=-1)
  31. printf("\n元素%d的位置是%d\n",k,i);
  32. else
  33. printf("元素%d不在表中\n",k);
  34. }

发表评论

表情:
评论列表 (有 0 条评论,317人围观)

还没有评论,来说两句吧...

相关阅读

    相关 二分查找(折半查找)

    二分查找 了解B+树的时候,看到了二分查找,发现自己只知道名称的意思是折半查找,却不知道是怎么去实现的。 后来查阅网上资料,发现二分查找必须要求数据是有序的,这样就

    相关 java实现二分查找折半查找

    算法思想:要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分