• 分治法二分查找


    分治
    分治法是将一个规模为n的问题分解为k个规模较小的子问题。注意:这里的子问题一定是相互独立且与原问题相同。用递归的方法解这些子问题。然后将各子问题的解合并到原问题的解。
    二分查找算法是运用分治的典型例子
    分治-二分查找
    给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。
    分析
    据此容易设计出二分搜索算法:
    在 a[0] <= a[1] <= ... <= a[n-1] 中搜索 x, 找到x时返回其在数组中的位置,否则返回-1

    int binarySearch(int a[], int x, int n)
    {
    int left = 0; int right = n - 1;
    //分别为最左边位置与最右边位置
    while (left <= right) {
    int middle = (left + right)/2;//中间位置
    if (x == a[middle]) return middle;
    if (x > a[middle]) left = middle + 1;
    else right = middle - 1;
    //比较中间元素与X的大小关系 若x > a[middle]说明左
    半区间元素都小于X,目标位置在右半区间,整体区间转
    为右半区间,反之整体区间转为左半区间
    }
    return -1; // 未找到x
    }

     例如:

    #include<iostream>
    using namespace std;
    #include<algorithm>
    int Bifind(int a[],int x,int n)//二分查找
    {
        int l=0,r=n-1;
        while(l<=r)
        {
            int m=(l+r)/2;
            if(x==a[m])return m;
            if(x>a[m])l=m+1;
            else r=m-1;
        }
        return -1;
    }
    int main()
    {
        //freopen("d:\\1.txt","r",stdin);
        int a[20],b[20],i,j=0;
        int x;
        cin>>x;
        cout<<x<<endl;
        for(i=0;i<20;i++)
        {
         cin>>a[i];
         b[j++]=i;
         cout<<a[i]<<' ';
        }
        cout<<endl;
        for(j=20-1;j>=0;j--)
        for(i=0;i<j;i++)
        {
            if(a[i]>a[i+1])
            {
                int temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
                temp=b[i];
                b[i]=b[i+1];
                b[i+1]=temp;
            }
        }
        for(i=0;i<20;i++)
        cout<<a[i]<<' ';
        cout<<endl;    
        if(Bifind(a,x,20)==-1)
         cout<<"未查找到:"<<endl;
         else cout<<b[Bifind(a,x,20)]+1<<endl; 
        return 0;
    }

     

  • 相关阅读:
    C#资源释放方法实例分析
    c#中在一个窗体中触发另一个窗体的事件
    C#定时器的用法
    C# 类的析构函数和释放函数
    C# 定时执行,文件占用
    C#多线程与异步
    Newtonsoft中JArray 转成list<object>
    C#中Dictionary的用法
    C# 解析Json文件(使用NewtonJson库)
    mysql无法远程连接10038错误的坑(阿里云ecs)
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2467303.html
Copyright © 2020-2023  润新知