二分查找

算法题16 二分查找及相关题目

天涯浪子 提交于 2020-01-23 22:43:33
  二分查找思想就是取中间的数缩小查找范围,对应不同的题目变形,在取到中间数mid确定下一个查找范围时也有不同,左边界有的low=mid+1,也可能low=mid,右边界有的high=mid-1,也有可能high=mid。 对于一个排序数组来说二分查找的时间复杂度是O(logn) 1. 二分查找法 1 int BinarySearch(int arr[],int len,int target) 2 { 3 if (arr==NULL||len<=0) 4 throw std::exception("Invalid input."); 5 int low=0,high=len-1; 6 while(low < high) 7 { 8 int mid = low+(high-low)/2; 9 if (arr[mid]>target) 10 high = mid-1; 11 else if (arr[mid]<target) 12 low = mid + 1; 13 else //find the target 14 return mid; 15 } 16 //the array does not contain the target 17 return -1; 18 } 2.二分查找之寻找边界   这种边界的寻找分为2种:最后1个小于某数的值,低边界;第1个大于某数的值,高边界

二分查找及基础排序

自作多情 提交于 2020-01-22 14:47:28
1 //冒泡排序 2 void bubbleSorte(int* arr, int len) 3 { 4 for (int i = 0; i < len - 1; i++) 5 { 6 for (int j = 0; j < len - 1 - i; j++) 7 { 8 if (arr[j] > arr[j + 1]) 9 { 10 arr[j] ^= arr[j + 1]; 11 arr[j + 1] ^= arr[j]; 12 arr[j] ^= arr[j + 1]; 13 } 14 } 15 } 16 } 1 //选择排序 2 void selectSorte(int* arr, int len) 3 { 4 for (int i = 0; i < len - 1; i++) 5 { 6 for (int j = i + 1; j < len; j++) 7 { 8 if (arr[i] > arr[j]) 9 { 10 arr[i] ^= arr[j]; 11 arr[j] ^= arr[i]; 12 arr[i] ^= arr[j]; 13 } 14 } 15 } 16 } 1 //插入排序 2 void insertSorte(int* arr, int len) 3 { 4 int i, j, t; 5 for (i = 1; i < len; i++) 6 {

【python】二分查找_排序

女生的网名这么多〃 提交于 2020-01-22 05:22:36
https://blog.csdn.net/alicelmx/article/details/80429229 # 实现一个二分查找 # 输入:一个顺序list # 输出: 待查找的元素的位置 def binarySearch ( alist , item ) : first = 0 last = len ( alist ) - 1 while first <= last : # " // "表示整数除法 mid = ( first + last ) // 2 print ( '中间值\n' , + mid ) # print( mid) if alist [ mid ] > item : last = mid - 1 elif alist [ mid ] < item : first = mid + 1 else : return mid + 1 return - 1 test = [ 0 , 1 , 2 , 8 , 13 , 17 , 19 , 32 , 42 ] print ( binarySearch ( test , 3 ) ) 排序算法 冒泡排序 https://www.cnblogs.com/jeffrey-yang/p/9866698.html 大的往后面排 下面来用Python代码来简单的实现冒泡排序算法。思路很简单,第一层循环表示总共需要进行几层遍历

MySql之索引底层深入解析

你。 提交于 2020-01-22 04:21:14
文章目录 1.索引概念 2.索引类型与创建 2.1.普通索引(Normal)又称 非唯一索引(None-Unique) 2.2.唯一索引(Unique) 2.3.全文索引(Fulltext) 3.索引数据结构存储模型推演 3.1.二分查找 3.2.二叉查找树(BST Binary Search Tree) 在线模拟 二叉查找树 3.3. 平衡二叉树(AVL Tree)(左旋、右旋) 1.索引概念 1. 数据库索引,是数据库的一个排序的数据结构,以协助快速查询、 更新数据库表中数据。 1. 首先数据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址。如果没有索引的话, 要从 500 万行数据里面检索一条数据,只能依次遍历这张表的全部数据, 直到找到这条数据。 2. 但是有了索引之后,只需要在索引里面去检索这条数据就行了,因为它是一种特殊的专门用来快速检索的数据结构, 我们找到数据存放的磁盘地址以后,就可以拿到数据 了。就像我们从一本 500 页的书里面去找特定的一小节的内容, 肯定不可能从第一页开 始翻。那么这本书有专门的目录,它可能只有几页的内容,它是按页码来组织的, 可以根据拼音或者偏旁部首来查找,只要确定内容对应的页码,就能很快地找到我们想要的内容。 2.索引类型与创建 2.1.普通索引(Normal)又称 非唯一索引(None-Unique) 1. 普通索引

[LeetCode] 704、二分查找

感情迁移 提交于 2020-01-22 00:29:49
题目描述 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target ,如果目标值存在返回下标,否则返回 -1 。 输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 解题思路 就是个纯粹的二分,注意 二分模版 。 参考代码 class Solution { public : int search ( vector < int > & nums , int target ) { int length = nums . size ( ) ; int left = 0 , right = length - 1 ; while ( left < right ) { int mid = left + ( ( right - mid + 1 ) >> 1 ) ; if ( nums [ mid ] > target ) right = mid - 1 ; else left = mid ; } if ( nums [ left ] == target ) return left ; else return - 1 ; } } ; 来源: CSDN 作者: aift 链接: https://blog.csdn.net/ft_sunshine

以区间为单位的二分查找

。_饼干妹妹 提交于 2020-01-21 01:24:51
【2019回家过年前的一记】 问题场景: 区间的格式如下,整体为一个Json字符串,每个区间的startTime和endTime都是按照从小到大的顺序排列的。 "[{\"endTime\":1578633955,\"startTime\":1578626876},{\"endTime\":1578640268,\"startTime\":1578634050},{\"endTime\":1578642086,\"startTime\":1578640291},{\"endTime\":1578643084,\"startTime\":1578642639}]" 现在给定一个用户需要查找的时间段: "startTime":1578585600, "endTime":1578644000 要求:返回该时间段内的所有区间,若查找的时间点位于某个区间中间,需要对该区间进行分割只返回所需要的那一段。 代码思路: ●首先将每个小区间的startTime和endTime依次存入一个数组中; ●使用二分查找该数组快速确定用户请求的时间段与原始区间的交集起始点位置index; ●从该位置开始将符合要求的区间依次放入新的json串中,期间需要对首尾两个区间进行特殊处理 【0,1】【2,3】【4,5】【6,7】 begin=0,end=7,mid=3 因为小区间都是两个元素,故mid在最后一步

二分查找时间复杂度推断

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-20 13:09:34
主要还是从算法所占用的「时间」和「空间」两个维度去考量。 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。 二分查找分析: 二分查找每次排除掉一半的不适合值,所以对于N个元素的情况: 一次二分剩下:N/2 两次二分剩下:N/2/2 = n/4 三次二分查找剩下:N/2/2/2 = N/8 ..... M次二分剩下:n / (2^M) 在最坏情况下是在排除到只剩下最后一个值之后得到结果,即 N / (2^m) = 1 所以由上式可得:2^m = N 推出时间复杂度是以2为底的对数公式: m = log2(N) 注意:m为查找次数, N为元素个数. 例如:求0-10000个元素中最多几次查找到73? m = log2(10000) m = 13次 来源: CSDN 作者: 慢慢的燃烧 链接: https://blog.csdn.net/u010164190/article/details/104049014

二分查找

眉间皱痕 提交于 2020-01-20 02:57:07
package sort ; /** * Created by lijie35 on 2020-01-19 1:55 PM . */ public class BinarySearch { public static void main ( String [ ] args ) { int [ ] arr = { 1 , 2 , 3 , 5 , 6 , 7 , 13 , 15 , 17 } ; int index = 7 ; System . out . println ( BinarySearch . search ( arr , index ) ) ; } public static int search ( int [ ] arr , int num0 ) { int start = 0 ; int end = arr . length - 1 ; while ( start <= end ) { System . out . println ( 111 ) ; //中点位置 int mid = start + ( ( end - start ) >> 1 ) ; //小于重点,说明在左边 if ( arr [ mid ] > num0 ) { end = mid ; //大于中点,说明在右边 } else if ( arr [ mid ] < num0 ) { start =

阿里面试真题:二分查找算法

心不动则不痛 提交于 2020-01-19 00:24:21
其实这个题目并不难,但是却是很实用,因为很多同学对于异常条件吃不准的话就会有问题。 看看JDK自带的二分查找吧 /** * Searches a range of * the specified array of longs for the specified value using the * binary search algorithm. * The range must be sorted (as * by the {@link #sort(long[], int, int)} method) * prior to making this call. If it * is not sorted, the results are undefined. If the range contains * multiple elements with the specified value, there is no guarantee which * one will be found. * * @param a the array to be searched * @param fromIndex the index of the first element (inclusive) to be * searched * @param toIndex the index of the

python//Jan.18th,2020//二分查找

此生再无相见时 提交于 2020-01-18 19:45:25
def binary_search ( list , item ) : low = 0 high = len ( list ) - 1 while low <= high : mid = ( low + high ) //2 guess = list [ mid ] if guess == item : return mid if guess > item : high = mid - 1 else : low = mid + 1 return None my_list = [ 1 , 3 , 5 , 7 , 9 ] s = binary_search ( my_list , 5 ) print ( s ) 来源: CSDN 作者: 我的吊真的大 链接: https://blog.csdn.net/weixin_44811068/article/details/104032669