在旋转后的排序数组中进行查找
2013-10-08 01:37
260 查看
首先,旋转的排序数组是指{4,5,6,7,0,1,2}这类的数组,就像是原本的排序数组经过左移后的效果。现在需要在这种数组中进行查找。
一、数组没有重复元素。
其实还是二分查找,不过比一般的二分查找情况多一些,思想是类似的。查找时间复杂度也是O(logn)。
二、数组有重复元素
在以上的情况中可能还需要考虑另外一种情况了,因为存在相同元素,所以不能简单通过low,mid的比较来得到接下来要进入哪个区间。一种极端的情况是{1,1,1,1,1,1,1}。
因此遇到相同元素的情况,需要顺序查找。
一、数组没有重复元素。
其实还是二分查找,不过比一般的二分查找情况多一些,思想是类似的。查找时间复杂度也是O(logn)。
int search(int A[], int n, int target) { int low = 0, high = n-1; while(low <= high){ int mid = low+(high-low)/2; if(A[mid] == target) return mid; // 左半区间是递增的 if(A[low] <= A[mid]){ if(target >= A[low] && target < A[mid]) high = mid-1; // 目标在左半区间且在mid左边 else low = mid+1; } else { // 右半区间是递增的 if(target < A[low] && target > A[mid]) low = mid+1; // 目标在右半区间且在mid右边 else high = mid-1; } } return -1; }
二、数组有重复元素
在以上的情况中可能还需要考虑另外一种情况了,因为存在相同元素,所以不能简单通过low,mid的比较来得到接下来要进入哪个区间。一种极端的情况是{1,1,1,1,1,1,1}。
因此遇到相同元素的情况,需要顺序查找。
bool search(int A[], int n, int target) { int low = 0, high = n-1; while(low <= high){ int mid = low+(high-low)/2; if(A[mid] == target) return true; // 左半区间是递增的 if(A[low] < A[mid]){ if(target >= A[low] && target < A[mid]) high = mid-1; // 目标在左半区间且在mid左边 else low = mid+1; } else if(A[low] > A[mid]){ // 右半区间是递增的 if(target < A[low] && target > A[mid]) low = mid+1; // 目标在右半区间且在mid右边 else high = mid-1; } else // 相等时顺序查找 low++; } return false; }
相关文章推荐
- 动易2006序列号破解算法公布
- C#数据结构与算法揭秘二
- 浅析STL中的常用算法
- JavaScript 组件之旅(二)编码实现和算法
- 将15位身份证补全为18位身份证的算法示例详解
- C++算法系列之日历生成的算法代码
- 1 2 3 4 5 6 7 8 9 = 110的java实现
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- 【代码】Pythonの代码片段
- STL中算法
- 数据结构&算法学习
- 算法的时间复杂度
- 算法导论:选择排序的原理与实现
- PHP实现四种常用的排序算法
- 图解插入排序算法
- 一些常见算法的JavaScript实现
- 平方根sqrt()函数的底层算法效率
- 二叉搜索树的一些相关算法介绍
- 欧几里德算法(辗转相处法)练手
- 面试中常见的一些算法问题