二分法查找

来源:互联网 发布:大数据聚类分析 编辑:程序博客网 时间:2024/05/29 13:19
//二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n / 2]与x做比较,如果x = a[n / 2], 则找到x,//算法中止;如果x<a[n / 2], 则只要在数组a的左半部分继续搜索x, 如果x>a[n / 2], 则只要在数组a的右半部搜索x//时间复杂度为O()=O(logn)//二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;//其缺点是要求待查表为有序表,且插入删除困难。//举例子 查找23//下标0  1   2   3   4    5   6  //数组11 17  23  34  46  49   62//第一次 low =0 high =6, mid = 0+6/2=3,a[3]=34,改变high = mid-1 =2;//第二次 low =0 hign =2, mid = 0+2/2=1,a[1]=17,改变low = mid+1=2;//第三次 low =2 high =2, mid =2,a[2]刚好为23,返回下标2,则总共寻找了三次。#include<iostream>using namespace std;//方法一 非递归//二分法查找,x是要被查找的元素,n是数组中元素个数//函数返回的是查找元素的下标 int ccount = 0;//标记查找次数int binarySearch(int list[], const int n ,const int x){int lower, high, mid;lower = 0, high = n - 1;while (lower <= high){ccount++;mid = (lower + high) / 2;if (x == list[mid])return mid;else if (x < list[mid])//x在左半区间high = mid - 1;else //x在右半区间lower = mid + 1;}   return -1;//没找到}int main(){int a[] = { 11, 17, 23, 34, 46, 49, 62 };int index = binarySearch(a, 7, 23);cout << ccount<<" "<< index <<" "<< a[index] << endl;system("pause");return 0;}//方法二 递归//int BinSearch(int list[], int low, int high, int x)//{//if (low <= high)//{//int mid = (low + high) / 2;////if (x == list[mid])//return mid;////else if (x < list[mid])//return BinSearch(Array, low, mid - 1, x);////else if (x > list[mid])//return BinSearch(Array, mid + 1, high, x);//}//else//return -1;//}


                                             
0 0
原创粉丝点击