二分法查找

二分法查找算法

[亡魂溺海] 提交于 2020-04-02 08:15:00
二分法查找算法 二分法算法,也叫折半算法,是一种检索效率比较高的方式,当数据量较大时用二分法查找会更快,但是数据需要先排好顺序,可以调用.sort();方法进行排序。 先确定该区间的中间位置K(2)将要查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。如果没有查到,则将当前查找区间将缩小一半,递归查找,直到找到为止。 在检索的时候我们需要先对其进行排序: Arrays.sort(arr); 为了便于操作,建议对其查找方法进行封装处理,定义好参数值: public static int myBinarySearch(int[] arr,int value) { } 在写这个方法之前我们需要先对其首位进行定义,我们可以对其声明一个变量: int start=0; int end=arr.length-1; 用while循环进行判断: while (start<=end) { int mid=(start+end)/2; if (value==arr[mid]) { return mid; } if (value>arr[mid]) { start=end+1; } if (value<arr[mid]) { end=mid-1; } } return -1; 如果没有查找到,则返回-1。 定义main方法和声明数组。 public

二分法查找

会有一股神秘感。 提交于 2020-03-10 08:42:05
二分法要注意的点是 分的是下标,然后注意+1更新,因为判断之后,如果不等于mid,则下一个范围不用包含上一个mid。 def erfen1 ( nums , a ) : min = 0 max = len ( nums ) - 1 if a > nums [ max ] or a < nums [ min ] : return [ ] while max >= min : mid = int ( ( max + min ) / 2 ) if a == nums [ mid ] : return mid elif a > nums [ mid ] : min = mid + 1 else : max = mid - 1 return [ ] print ( erfen1 ( [ 3 , 4 , 5 , 6 , 7 , 8 , 9 ] , 9 ) ) 时间复杂度是O(logn) 如何看呢,原来的长度是n,每一次划分都是除以2,最后的长度是1,所以等式 x代表的是二分的次数。x = log(n) 。2在这里可以不写,与5n的系数不写的道理一样。 来源: CSDN 作者: caihuanqia 链接: https://blog.csdn.net/caihuanqia/article/details/104747769

数据结构 二分法查找

社会主义新天地 提交于 2020-03-08 11:18:09
/* 二分法查找 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* 二分法查找是一种在有序数组中查找特定元素的搜索算法 二分法查找的时间复杂度O(logn) */ //递归算法 int recurbinary(int *a, int key, int low, int high) { int mid; if (low > high) { return -1; } mid = low + (high - low) / 2; if (a[mid] == key) { return mid; } else if (a[mid] > key) { return recurbinary(a, key, low, mid - 1); } else { return recurbinary(a, key, mid + 1, high); } } //非递归算法 int binary(int *a, int key, int n) { int left = 0, right = n - 1, mid = 0; mid = left + (right - left) / 2; while (left < right && a[mid] != key) { if (a[mid] < key) { left = mid +

二分法查找算法 (递归)

眉间皱痕 提交于 2020-03-06 21:45:23
有一由小到大排列的数组m[],数组大小为n,请用二分法查找算法找出与关键数key相等的元素,若查找成功返回元素在数组中的位置,没找到返回-1. 1 // 二分查找.cpp 2 3 #include "stdafx.h" 4 #include <string> 5 6 int search(int m[],int key,int low,int high) 7 { 8 int mid=(low+high)/2; 9 if (low>high) 10 return -1; 11 if (key==m[mid]) 12 return mid; 13 else if (key<m[mid]) 14 return search(m,key,low,mid-1); 15 else 16 return search(m,key,mid+1,high); 17 } 18 19 void main() 20 { 21 int a[]={1,2,5,7,9,12,16}; 22 int i,len; 23 len=sizeof(a)/sizeof(a[0])-1; 24 i=search(a,12,0,len); 25 printf("%d\n",i); 26 } 来源: https://www.cnblogs.com/xingele0917/archive/2012/10/04/2711628

二分法在循环有序数组查找元素

ぐ巨炮叔叔 提交于 2020-03-02 12:19:17
//在 O(logN) 时间内,从循环有序数组里查找元素 //二分之后,总有一半是有序数组 public static int searchInLoopSortedArray(int[] nums, int target) { if(nums.length == 0) return -1; int low = 0; int high = nums.length - 1; while (low <= high) { int mid = low + ((high - low) >> 1); if(nums[mid] == target) return mid; if(nums[low] <= nums[mid]) { if(nums[mid] > target && nums[low] <= target) { high = mid - 1; } else { low = mid + 1; } } else if(nums[low] > nums[mid]) { if(nums[mid] < target && nums[high] >= target) { low = mid + 1; } else { high = mid - 1; } } } return -1; } 来源: CSDN 作者: 发霉的宅大人 链接: https://blog.csdn.net/Qinhaifu

二分法查找

…衆ロ難τιáo~ 提交于 2020-02-29 16:40:10
二分法查找适用查找一组有序数列,例如10,15,25,36,49,55,62,78,99,200这种单调递增的数列 二分查找的基本思想如下: 1、left对应数列第一个数的位置(即0),right对应数列最后一个数的位置(即n-1),mid设置为(left+right)/2。 2、比较需要查找的数值key和mid这个位置所对应的数值大小, 若key小于arry[mid],则right=mid-1,查找区间变为[left,mid-1] 若key大于arry[mid],则left=mid+1,查找区间变为[mid+1,right] 若key等于arry[mid],则查找成功 3、重复上述循环,直至查找成功或left>right 下面给出一张查找的例图,以数组10,15,25,36,49,55,62,78,99,200为例,查找78 查找14 下面贴出代码 public static void main(String args[]){ int[] arr ={10,20,30,40,50,60,70,80,90,100}; int num_input; int mid = 0; int left=0; int right; System.out.println("请输入要查找的数"); Scanner sc =new Scanner(System.in) ; num_input=sc

python 二分法查找

瘦欲@ 提交于 2020-02-26 17:41:42
二分法的适用条件 二分法查找适用于数据量较大时, 但是数据需要先排好顺序.    优点 : 二分法查找效率特别高    缺点 : 二分法只适用于有序序列 二分法的主要思想是: 设查找的数组区间为array[low, high] (1)确定该区间的中间位置k (2)将查找的值T与array[k]比较. 若相等, 查找成功返回此位置, 否则确定新的查找区域, 继续二分查找。区域确定如下: T < array[k] 由数组的有序性可知T < array[k,k+1,……,high], 故新的区间为array[low,……,k-1] T > array[k] 由数组的有序性可知T > array[low,……,k-1], 故新的区间为array[k,k+1,……,high] 每一次查找与中间值比较, 可以确定是否查找成功,不成功则当前查找区间将缩小一半, 递归查找即可. 例题: 用二分法查找一个数是否在随机数列中 方法1(使用while循环): 步骤1: 拿到一个有100个随机数的列表 import random # 引入一个随机数模块 def random_100 ( amount ) : li = [ ] for i in range ( amount ) : # 循环多少次就拿多少个随机数 s = random . randint ( 0 , 100 ) li . append (

二分法查找的java实现

自闭症网瘾萝莉.ら 提交于 2020-01-27 02:29:52
算法 .二分法 二分法也就是折半查找,在 有序 的数列中查找指定的元素,设定最小索引( low )和最大索引( height-1 )还有中间值mid( (low+height-1)/2 ),这种查找,如果中间值比指定元素小让low=mid+1,如果中间值比指定元素大,让height=mid-1; 以上是大体思路,下面展示两个动图,帮助理解 第一个图表示了二分法的整体过程; 第二个图表示了原方法的整体过程; 观察可得二分法的优越性! 代码实现 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Scanner; public class Main2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int arr[] = { 2, 5, 6, 8, 9, 4, 7 }; Arrays.sort(arr); int deix(索引) = getxiabiao(arr, 7); } public static int getxiabiao(int[] arr, int key) { int

C基础算法之二分法查找

僤鯓⒐⒋嵵緔 提交于 2020-01-23 22:48:44
算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。 基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。 二分法查找在针对大量有序排列的情况下发挥出很优越的效率,这里以最具规律性的数组为例,代码如下: 示例代码: /* binarysearch2.c --- * * Filename: binarysearch2.c * Description: 用循环方式和递归两种方式 实现二分法查找过程 * Author: magc * Maintainer: * Created: 三 7月 25 23:26:52 2012 (+0800) * Version: * Last-Updated: 四 7月 26 00:22:37 2012 (+0800) * By: magc * Update #: 74 * URL: * Keywords: 递归 二分法查找 * Compatibility: * */ /* Commentary: * * * */ /* Change Log: * 添加循环方式和递归方式 * */ /* Code: */ #include <assert.h> #include <ctype.h>

二分法查找

≯℡__Kan透↙ 提交于 2020-01-23 00:24:15
一、简介 二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。 二分法查找的思路如下: (1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。 (2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。 (3)如果某一步数组为空,则表示找不到目标元素。 二分法查找的时间复杂度O(logn),优于常规O(n)时间复杂度的算法。 是程序员必须掌握的基础算法之一,在笔试面试中较高频率考察。 二、无重复查找算法 如果数组元素是不重复的(已排序),那么只有一个查找目标。 int binarySearchSingle(vector<int>& array, int target) { int left = 0, right = array.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (array[mid] == target) return mid; else if (array[mid] < target) left = mid + 1; else right = mid - 1; } return -1; } 三、有重复查找算法 如果数组元素是不重复的(已排序)