在一个基本有序的数组中查询指定元素
2017-01-03 10:56
543 查看
一个数组中的元素是基本有序的,意思就是说当遇到次序打乱的元素的时候,它与自己有序的正确位置只能是前后相邻的位置,比如数组:
arr=[1,2,3,4,5,7,6,8,9,10]
这个数组6前面相邻的7调换一下就称为一个有序的数组。
如果一个数组完全有序,那么我们可以用二分查找法很快找到指定的元素,但是现在是基本有序,那还能不能用二分查找法呢,答案是可以的,不过得稍稍改一下。
我们已经直到了一个数组基本有序的意思是讲,即使出现乱序的情况,只要在前后相邻位置做恰当地调整,就能够调为有序,也就是说局部无序的元素长度不超过2,有了这个条件那就简单多了,我们仍然用二分查找法,无非不过是需要多一个比对一下相邻元素的情况这一步骤罢了:
该算法的时间复杂度仍为O(logn),这比横向扫描一遍的时间复杂度O(n)强点。
arr=[1,2,3,4,5,7,6,8,9,10]
这个数组6前面相邻的7调换一下就称为一个有序的数组。
如果一个数组完全有序,那么我们可以用二分查找法很快找到指定的元素,但是现在是基本有序,那还能不能用二分查找法呢,答案是可以的,不过得稍稍改一下。
我们已经直到了一个数组基本有序的意思是讲,即使出现乱序的情况,只要在前后相邻位置做恰当地调整,就能够调为有序,也就是说局部无序的元素长度不超过2,有了这个条件那就简单多了,我们仍然用二分查找法,无非不过是需要多一个比对一下相邻元素的情况这一步骤罢了:
public class SearchAlmost { // A recursive binary search based function. It returns index of x in given array arr[l..r] is present, otherwise -1 public static int binarySearch(int arr[], int l, int r, int x) { if (r >= l) { int mid = l + (r - l) / 2; // If the element is present at one of the middle 3 positions if (arr[mid] == x) return mid; if (mid > l && arr[mid - 1] == x) return (mid - 1); if (mid < r && arr[mid + 1] == x) return (mid + 1); // If element is smaller than mid, then it can only be present in left subarray if (arr[mid] > x) return binarySearch(arr, l, mid - 2, x); // Else the element can only be present in right subarray return binarySearch(arr, mid + 2, r, x); } // We reach here when element is not present in array return -1; } public static void main(String args[]) { int arr[] = {3, 2, 10, 4, 40}; int n = arr.length; int x = 4; int result = binarySearch(arr, 0, n - 1, x); if (result == -1) System.out.println("Element is not present in array"); else System.out.println("Element is present at index " + result); } }
该算法的时间复杂度仍为O(logn),这比横向扫描一遍的时间复杂度O(n)强点。
相关文章推荐
- merge两个有序数组 & 查找一个有序数组中指定元素
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 求一个很大的数组(乱序)排序后从第i大到第j大之间的所有元素,并且这些元素之间要求有序
- 面试题:给定一个有序的数组,如果往该数组中存储一个元素,并保证这个数组还是有序的,那么元素的存储的角标位如何获取。
- 设计一个模板类Sample,用于对一个有序数组采用二分法查找元素下标
- 求一个长度为n的整型有序数组中是否有出现次数超过n/2的元素
- 黑马程序员-有一个有序的数组,想要将一个元素插入到该数组中,并保证该数组是有序的
- 在一个二维有序数组中,查找指定的数据是否存在
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- 求一个值是否是一个给定有序数组中两个元素的和
- range() 函数创建并返回一个包含指定范围的元素的数组
- 程序员面试题目总结--数组(一)【递归求数组所有元素和、用一个for循环打印出一个二维数组、用递归判断数组是否是递增、有序数组中删除重复元素】
- 有序整型数组A,大小为n,请给出一个O(n)的算法,删除重复元素,O(1)空间
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 两个数字,1000个元素的有序数组和10个元素的无序数组,把他们整合成一个按照有序数组排序方式排序的有序数组
- 得到一个含有100以内不重复的随机数元素并且有序的数组。
- 每日雕蟲一技[2013-04-10]用Jquery删除一个数组中指定值的元素
- 在一个有序数组中,有些元素重复出现。输入一个数值,求此值在数组中重复的次数
- 在一个升序的但是经过循环移动的数组中查找指定元素