倒置数组元素查找--时间复杂度O(lgn)
来源:互联网 发布:qt 关闭release优化 编辑:程序博客网 时间:2024/04/29 23:47
/** * * @author jiadongkai * @date Dec 2, 2011 * */public class BinSearch { /** * 有序数组[1,2,3,4,5] * 折半查找arr数组中num的index,不存在返回-1 * @param arr * @param num * @return */ public static int binSearch(int[] arr, int num){ int low = 0, high = arr.length-1; int mid = 0; while(low <= high){ count++; mid = (low+high)/2; if(arr[mid] == num) return mid; if(arr[mid] < num)//合适的位置在后半部分 low = mid + 1; else //合适的位置在前半部分 high = mid - 1; } return -1; } static int count ; /** * [1,2,3,4,5]->[4,5,1,2,3] * 在倒置的数组中查找一个元素 * * 选取mid之后,前后必有一半是有序的。比较low/mid-1和mid+1/high * 这两对位置的值就知道 * 如果num落在有序的一半, * 接下来的查找都变成折半查找;如果num落在无序的一半, * @param arr * @param num * @return */ public static int exBinSearch(int arr[], int num){ int low = 0, high = arr.length-1; int mid = 0; //用于标记num是否已经进入有序那一半 //若进入,则下次直接使用折半查找的逻辑 boolean flag = false; while(low <= high){ count++; mid = (low + high)/2; if(arr[mid] == num) return mid; if( !flag && (arr[low] <= arr[mid-1])){ //若前半部分有序 if((arr[low] <= num) && (num <= arr[mid-1])){ //若num落在有序的前半部分 System.out.println("进入有序数组:"+(low)+" -> "+(mid-1)); flag = true; high = mid -1; }else{ //若num落在后半部分 low = mid + 1; } continue; } if( !flag && arr[mid+1] <= arr[high]){ //若后半部分有序 if( (arr[mid+1] <= num) && (num <= arr[high])){ //若num落在有序的后半部分 System.out.println("进入有序数组:"+(mid+1)+" -> "+high); flag = true; low = mid+1; }else{ //若num落在无序的前半部分 high = mid - 1; } continue; } //能运行下面的逻辑,必然是已经确定num落在有序的部分了 if( arr[mid] < num ) low = mid + 1; else high = mid - 1; } return -1; } public static void main(String args[]){ int arr[] = {1,3,5,6,7,8,9,10,22,34,56,67,89,100}; int arr2[] = {67,89,100,1,3,5,6,7,8,9,10,22,34,56}; int demo[] = {1,3,5,11,100,56,90,1000}; for(int i : demo){ System.out.println("---------比较i="+i+"-------------"); System.out.println( i + "的index:" + binSearch(arr, i) ); System.out.println("比较次数:"+count); count=0; System.out.println( i + "的index:" + exBinSearch(arr2, i)); System.out.println("比较次数:"+count); } }}
//~~~~
---------比较i=1-------------
1的index:0
比较次数:3
进入有序数组:3 -> 3
1的index:3
比较次数:4
---------比较i=3-------------
3的index:1
比较次数:8
3的index:4
比较次数:3
---------比较i=5-------------
5的index:2
比较次数:5
5的index:5
比较次数:4
---------比较i=11-------------
11的index:-1
比较次数:8
进入有序数组:7 -> 13
11的index:-1
比较次数:4
---------比较i=100-------------
100的index:13
比较次数:8
100的index:2
比较次数:2
---------比较i=56-------------
56的index:10
比较次数:4
进入有序数组:7 -> 13
56的index:13
比较次数:4
---------比较i=90-------------
90的index:-1
比较次数:8
90的index:-1
比较次数:4
---------比较i=1000-------------
1000的index:-1
比较次数:8
1000的index:-1
比较次数:4
- 倒置数组元素查找--时间复杂度O(lgn)
- 面试题精选(75):经过旋转的有序数组中的元素查找(要求复杂度为O(lgn))
- 在旋转后的有序数组中查找元素,要求O(logn)的时间复杂度
- 在旋转后的有序数组中查找元素,要求O(logn)的时间复杂度
- 斐波那契数的 O(lgn) 时间复杂度算法
- 利用矩阵求解fibonacci数列 时间复杂度为O(lgn)
- O(n*lgn)时间复杂度的逆序对统计算法实现思想
- 统计数组中每个元素出现的个数,时间复杂度 O(n),空间 O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 统计数组中不同元素出现的次数(时间复杂度O(n),空间复杂度o(1))
- 统计数组中不同元素出现的次数(时间复杂度O(n),空间复杂度o(1))
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 统计数组中不同元素出现的次数(时间复杂度O(n),空间复杂度o(1))
- 时间复杂度为o(N)查找1至N-1构成的a[N]重复元素
- 时间复杂度为o(N)查找1至N-1构成的a[N]重复元素
- 时间复杂度为o(N)查找1至N-1构成的a[N]重复元素
- 数组中查找第k小元素的复杂度为O(n)的算法
- android 面试题集
- B-TREE
- 一个图片
- centos6.1安装VSFTPD过程
- 【转载】mini2440 SPI驱动移植
- 倒置数组元素查找--时间复杂度O(lgn)
- Linux shell脚本中判断变量文件目录:权限、是否存在、空值、相等
- C++的64位整数[原]by 赤兔
- MySQL 引擎 概述
- Linux汇编写引导扇区
- 文章统计日点击、周点击、月点击制作思路(存储过程实现)
- uva457 Linear Cellular Automata
- 【模拟】使用蒙特卡罗算法计算圆周率
- linux2.6 内核的 initrd