C# 二分查询

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 二分查询
{
    class Program
    {
        static void Main(string[] args)
        {

            int[] array = { 10, 20, 50, 6, 45, 10, 33, 25, 40, 5 };

            Array.Sort(array);

            Console.Write("数组排序之后: ");
            foreach (var i in array)
            {
                Console.Write(i + ",");
            }

            Console.WriteLine();
            int a = SearchFun(array, 45);
            Console.WriteLine("找到的值:" + a);

            Console.Read();
        }

        static int SearchFun(int [] array,int value)
        {
            int mid, low, high;

            low = 0;
            high = array.Length - 1;

            while (low < high)
            {
                mid = (low + high) / 2;                 //数组从中间找
                if (array[mid] == value)
                    return array[mid];

                if (array[mid] > value)                 //数组中的值 大于 要找的值, 继续在数组下部分查询
                    high = mid - 1;
                else
                    low = mid + 1;                      //数组中的值 大于 要找的值, 继续在数组上部分查询
            }

            return -1;

        }

    }
}

时间: 2024-10-21 22:54:36

C# 二分查询的相关文章

算法学习01:二分查询,选择法、插入法、分治法排序

查询与排序是使用的再频繁不过的两个功能,算法学习系列实现语言为C#. 一般情况下的查询 Int32 Search(Int32[] source, Int32 task) { var index = 0; while (index < source.Length) if (source[index++] == task) return index - 1; //返回值为Length则说明未找到 return source.Length; } 时间复杂度为O(n),在检索源没有排序的情况下,这即为最

python--算法--中二分查询

list =[2,3,5,10,15,16,18,22] min=0 max=len(list) a=22 while min< max: mid=int((min+max)/2) num=list[mid] if a==num: print("你要找的数排在: "+str(mid+1)) if a>num: min=mid+1 else: max=mid 原文地址:https://www.cnblogs.com/fqqwz/p/11634599.html

CDQ分治与整体二分总结

Cdq分治和整体二分是两个很奇妙的东西.他们都是通过离线的思想来进行优化,从而更快的求出解. 整体二分通俗的讲就是二分答案,但是它了不起的地方是一下子把所有的答案都二分出来了,从而可以一下子得出所有查询. CDQ分治通俗的讲就是二分查询.通常的做法是把所有的查询分成两半,然后通过递归先计算出左边一半的所有的查询,然后通过这些已知的左半边的值来更新右半边的值.这里,最最重要的思想是通过左半边来更新右半边.更具体一点,就是用左半边的修改来更新右半边的查询. 重要的事情说话三遍: CDQ分治就是通过左

[HDOJ5676]ztr loves lucky numbers(状压枚举,打表,二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5676 题意:输入一个正整数n(n <=10^18),求不小于n的只有4和7组成的数,且4和7数量相同 枚举2~18位偶数位的4.7的组合,01分别代表4或7.存下来后排序,二分查询. trick就是LL存不下20位的数,但是n<=10^18,那么只要特判大于777777777444444444的数都输出44444444447777777777就行了. 1 #include <bits/std

noip 2012 借教室 (线段树 二分)

/* 维护区间最小值 数据不超int 相反如果long long的话会有一组数据超时 无视掉 ll int */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 1000010 #define ll int #define inf 0x7fffffff using namespace std; ll n,m,num,a[maxn],falg; struct node { ll lc,r

湖南省第十一届大学生程序设计竞赛:Internet of Lights and Switches(HASH+二分+异或前缀和)

Internet of Lights and Switches Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3  Solved: 3[Submit][Status][Web Board] Description You are a fan of "Internet of Things"(IoT, 物联网), so you build a nice Internet of Lights and Switches in your huge

CF817F MEX Queries(线段树上二分)

题意 维护一个01串,一开始全部都是0 3种操作 1.把一个区间都变为1 2.把一个区间都变为0 3.把一个区间的所有数字翻转过来 每次操作完成之后询问区间最小的0的位置 l,r<=10^18 题解 区间操作想到线段树,离散化不用说,l,r太大了. 1,2,3操作非常好维护. 然后在查询中二分查询就好了. 一开始看别的博客(对,我看题解了,太菜)说要加1节点和r+1节点不知道为什么. 因为我的查询想的是,查询前面全都是1的区间的长度.后来发现做不了.就乖乖照题解做了. 1 #include<i

HDU - 4417 Super Mario(分块+二分)

将给定区间分块,将每个块从小到大排序,二分查询每个块, #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define sc(x) scanf("%d",&(x)) using namespace std; const int maxn=1e5+10; int block,mub,l[maxn],r[maxn],belong[maxn]; int arr[maxn],n,m,tt[maxn

PAT甲级1010踩坑记录(二分查找)——10测试点未过待更新

题目分析: 首先这题有很多的坑点,我在写完之后依旧还有第10个测试点没有通过,而且代码写的不优美比较冗长勿喷,本篇博客用于记录写这道题的一些注意点 1.关于两个不同进制的数比大小一般采用将两个数都转化为10进制之后比较大小(下面统称已知进制数为N1,未知进制数为N2) 2.虽然两个数都只有10位,且每一位上的数字是从‘0’~‘z’,分别代表0~35,但是这并不意味值这题的进制范围就是2~36,radix完全有可能很大很大到long long,写‘0’~‘z’只是为了让结果计算出来相对小一些,并且