[关闭]
@rg070836rg 2015-08-16T15:11:55.000000Z 字数 791 阅读 1625

顺序查找以及折半查找

data_structure

一、顺序查找

顺序查找的基本思路如下:

  • 顺序扫描序列表
  • 若匹配,返回下标
  • 若不匹配,返回-1
  1. //无监视哨的顺序查找
  2. int SeqSearch(Record *r, int n, int k)
  3. {
  4. int i = 0;
  5. while (i < n&&r[i].key != k)
  6. i++;
  7. if (i < n)
  8. return i;
  9. return -1;
  10. }
  11. //有监视哨的顺序查找
  12. int SeqSearch2(Record *r, int n, int k)
  13. {
  14. int i = 0;
  15. r[n].key = k;
  16. while (r[i].key != k)
  17. i++;
  18. if (i < n)
  19. return i;
  20. return -1;
  21. }

测试结果:
此处输入图片的描述

此处输入图片的描述

二、折半查找

折半查找的基本思想是在有序表中,取中间元素作为比较对象。

  • k==mid , 成功
  • k < mid , 左半区继续查找
  • k>mid , 右半区继续查找

重复上述查找过程,直到查找成功,或所查找的区域无记录,查找失败。

  1. //折半查找非递归算法
  2. int BiSearch(Record r[], int n, int k)
  3. {
  4. int low = 0;
  5. int high = n - 1;
  6. while (low <= high)
  7. {
  8. int mid = (low + high) / 2;
  9. if (r[mid].key == k)
  10. return mid;
  11. else if (r[mid].key < k)
  12. low = mid + 1;
  13. else high = mid - 1;
  14. }
  15. return -1;
  16. }
  17. //折半查找递归算法
  18. int BiSearch2(Record r[], int low, int high, int k)
  19. {
  20. if (low>high)
  21. return -1;
  22. else
  23. {
  24. int mid = (low + high) / 2;
  25. if (r[mid].key == k)
  26. return mid;
  27. else
  28. if (r[mid].key < k)
  29. return BiSearch2(r, mid + 1, high, k);
  30. else
  31. return BiSearch2(r, low, mid - 1, k);
  32. }
  33. }

测试结果:
此处输入图片的描述

此处输入图片的描述

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注