二分查找算法

来源:互联网 发布:两小无猜网络剧是bl吗 编辑:程序博客网 时间:2024/06/07 13:16

二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:
    1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,
    2.寻找{6, 7, 8, 9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。

二分查找算法就是不断将数组进行对半分割,每次拿中间元素和goal进行比较。

// binary_search.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream>int binary_search(int *a, int len, int goal){int low = 0;//二分查找的低位int high = len-1;//二分查找的高位while(low <= high){int middle = (low+high)/2;//中间位置if(a[middle] == goal)//如果中间位置元素与目标元素相等{return middle;//返回所在的位置}else if(a[middle] > goal)//在左半边{high = middle-1;}else//在右半边{low = low+1;}}return -1;//没有找到}int _tmain(int argc, _TCHAR* argv[]){const int LEN = 10000;int a[LEN];//给数组赋值for(int i = 0; i < LEN; i++){a[i] = i-5000;}////打印数组//for(int i = 0; i < LEN; i++)//{//if(i%100 == 0)//std::cout<<std::endl;//std::cout<<a[i]<<"  ";//}int goal = 0;int index = binary_search(a,LEN,goal);//返回目标位置if(index != -1){std::cout<<goal<<"在数组中的位置为:"<<index<<std::endl;}elsestd::cout<<"不存在"<<goal<<std::endl;return 0;}

注:转载源地址