二分法查找元素的位置

二分法的用途:能在大量的数据中找到自己想找的元素,减少查找的循环的次数。
二分法的条件:是一个有序的序列,才能使用二分法。

二分法的原理:将一个有序数列,查找的时候利用中间值,来一步步缩小搜索的范围,最终找到最终结果。
    1  将数组长度为n的,排好序,升降序没有关系。

    2  先把数组的范围标记好分别用low,和high来表示数组的范围,然后找到数组的中间元素 mid=(low+high)/2,和你所查找的元素 key进行对比,如果key的数值较为大的话,就进入 (mid,high)的范围在进行查找元素,如果key的元素较为小的话就进入 (low,mid)的范围查找,每次循环这个步骤。
        这时我们只需要根据key,与数组的最中间的值进行比较,根据结果改变low,high的值就好了。
看一下代码: 这串代码的作用是将一个长为N的数组将其排序后,在查询K在排序后的位置。
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int search(int z[], int n, int key) {//函数的功能查找元素,能代表长度,z数组名,key是要查找的元素。
 int low = 1;
 int high = n;//low,high是范围
 int mid;//中间值
 while (low <= high) {
  mid = (low + high) / 2;
  if (z[mid] == key)//如果找到元素之后,返回元素的位置
   return mid;
  if (z[mid] > key) {
   high = mid - 1;
  }
  else if (z[mid] < key)
   low = mid + 1;
  }
 return -1;//如果没有找到就返回-1;
}
int main()
{
 int z[99];
 int i, j, k,n;
 cin >> n;
 for (i = 1; i <=n; i++) {
  scanf("%d", &z[i]);
 }
 scanf("%d", &k);
 sort(z + 1, z + n+1);
 int flag = search(z, i, k);//一个标志,看是否查找到元素
 if(flag==-1)
 printf("no find");
 else printf("%d\n", flag);
 return 0;
}

你可能感兴趣的:(二分法查找元素的位置)