顺序查找+二分查找(折半查找)

---恢复内容开始---

1:顺序查找

所谓的快速查找就是将我们要找的数在数组中快速遍历一遍。

找出我们要找的数,并返回该数在数组中的下标。

这种方法需要将数组中的数依次遍历,找到目标数的时候才停止。

这种方法在最差的情况下的时间复杂度为O(n);下面我们来看看代码;

#include<iostream>
using namespace std;
int main()
{
    int A[]={1,12,2,3,4,5,6,8,2,4};
    int x;
    int sum=0; 
    cin>>x;//输入要查找的数;
    for(int i=0;i<11;i++)
    {
        if(x==A[i])
        {
            sum++;
            cout<<i;//查找到目标数。返回该数的下标 
            break;
        }
     }
     if(sum==0) cout<<"-1";//如果数组中没有目标数,返回-1; 
     return 0; 
 } 

这种方法的代码实现比较简单。

2:二分查找

二分查找也叫折半查找。要求这个序列是有序序列。

二分查找的时间复杂度为O(logn),比顺序查找要快一些,比具体步骤如下:

1:找到序列的中点,比较目标数与序列中点对应的数的大小。

2:目标数大于序列中点对应的数,序列的起点变为原序列的中点加1一;

目标数小于序列中点对应的数,序列的终点变为原序列的中点减一。

目标数等于序列中点对应的数,返回该数在序列中对应的下标。

3:重复步骤1,2直到找到目标数或者该序列中没有该数时结束。

int BinSearch(int R,int K)//R为有序表,k为要查找的目标数 
{
//在有序表R[1..n]中进行二分查找,成功时返回结点的位置,失败时返回零
    int low=1;
    int high=n;
    int mid;    
    //置当前查找区间上、下界的初值
    while(low<=high)   
    //当前查找区间R[low..high]非空
    {
        mid=(low+high)/2if(R[mid]==K)
            return mid;
            //查找成功返回
        if(R[mid]>K)
           high=mid-1;
           //继续在R[low..mid-1]中查找
        else
           low=mid+1//继续在R[mid+1..high]中查找
    }
   return 0;
   //当low>high时表示查找区间为空,查找失败
}

如果该序列无序,可用sort函数进行快排。二分查找比顺序查找要快,但是也是有缺点的,

就是二分查找需要将序列排序,序列如果是无序的那么就需要将序列排序,而排序本身就

是比较费时,即使用高效率的排序算法也要花费O(nlogn)的时间。

所以我们要采用二分查找时我们就要考虑这个序列是否是经常改动,

如果这个序列的不能保持有序性,那么二分查找就不再适用。

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/zhoubo123/p/11249770.html