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;
    	}
    }
    
  • 相关阅读:
    SHA1加密算法 java
    CMD命令名详细大全
    springMVC get请求及其请求地址写法
    webService 接口调用配置
    使用jdk操作 wsdl2java (wedservice)
    编码问题(utf-8,gbk,utf-16be)
    9 个让 JavaScript 调试更简单的 Console 命令
    让姑姑不再划拳 码农也要有原则 : SOLID via C#
    工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)!
    2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>
  • 原文地址:https://www.cnblogs.com/aoximin/p/13209604.html
Copyright © 2011-2022 走看看