zoukankan      html  css  js  c++  java
  • 重新整理数据结构与算法—— 二分查找法[十二]

    前言

    什么是二分查找呢?

    直接给一个地址哈,避免误解。

    https://baike.baidu.com/item/二分法查找/9751511#1

    根据我发的这个链接呢?我们知道通过二分查找一定有一个硬性要求,那就是说一定要按照某种顺序排列,不一定是大小。

    比如说有一个数组为:{1,2,5,10,11,16,18,20,100},如果如果你要查找100,如果按照遍历的话,那么要到最后一个。

    如果通过二分法,那么第一个比较的就是11了,比11大,那么右边是不用再去查找了的。

    同意我们要判断什么时候找到,且要分析好如果没有这个数该怎么办?

    好的,那么按照这个思路就可以来写一写了。

    正文

    代码如下:

    static void Main(string[] args)
    {
    	int[] arr = new int[]{1,2,5,10,11,16,18,20,100 };
    	Console.WriteLine(binarySearch(arr,0,arr.Length-1,100));
    	Console.ReadKey();
    }
    
    
    public static int binarySearch(int[] arr,int left,int right,int findValue)
    {
    	//表示没有找到
    	if (left>right)
    	{
    		return -1;
    	}
    	int mid = (left + right)/2;
    	if (findValue > arr[mid])
    	{
    		return binarySearch(arr, mid + 1, right, findValue);
    	}
    	else if (findValue < arr[mid])
    	{
    		return binarySearch(arr, left, mid- 1, findValue);
    	}
    	else
    	{
    		return mid;
    	}
    }
    

    代码非常简单哈。

    可能呢,我们需要找到的有几个,其实这也非常简单,是这样的。

    我们找到了这个后,可以向前扫描或者向后扫描,然后得出结果。

    static void Main(string[] args)
    {
    	int[] arr = new int[]{1,1,1,1,2,5,10,11,16,18,20,100 };
    	List<int> list= binaryListSearch(arr, 0, arr.Length - 1, 1);
    	foreach (var u in list)
    	{
    		Console.WriteLine(u);
    	}
    	Console.ReadKey();
    }
    
    public static List<int> binaryListSearch(int[] arr, int left, int right, int findValue)
    {
    	List<int> result = new List<int>();
    	int temp = binarySearch(arr, 0, arr.Length - 1, findValue);
    	if (temp != -1)
    	{
    		for (int i =0 ; i <= temp - 1; i++)
    		{
    			if (arr[i] == arr[temp])
    			{
    				result.Add(i);
    			}
    		}
    		result.Add(temp);
    		for (int i = temp + 1; i < arr.Length; i++)
    		{
    			if (arr[i] == arr[temp])
    			{
    				result.Add(i);
    			}
    		}
    	}
    	return result;
    }
    
    public static int binarySearch(int[] arr,int left,int right,int findValue)
    {
    	//表示没有找到
    	if (left>right)
    	{
    		return -1;
    	}
    	int mid = (left + right)/2;
    	if (findValue > arr[mid])
    	{
    		return binarySearch(arr, mid + 1, right, findValue);
    	}
    	else if (findValue < arr[mid])
    	{
    		return binarySearch(arr, left, mid- 1, findValue);
    	}
    	else
    	{
    		return mid;
    	}
    }
    
  • 相关阅读:
    高可用-mysql安装,双主模式+keepalived
    源码-mybatis-01-SqlSessionFactory创建
    J.U.C-volatile
    设计模式-模板设计模式(行为)
    设计模式-代理模式
    线程-join();
    Net Core 文件的上传下载
    mysql 开启日志记录执行SQL语句
    C# 方法多个返回值
    C# get set 方法 设置默认值
  • 原文地址:https://www.cnblogs.com/aoximin/p/13209604.html
Copyright © 2011-2022 走看看