欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

在移位数组中查找数

发布时间:2023/11/29 编程问答 55 豆豆
生活随笔 收集整理的这篇文章主要介绍了 在移位数组中查找数 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目描述:

一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。

 

解析:

很多解法的时间复杂度都停留在O(n),下面的解法 仍为二分查找法 只不过 对应题目做了相应的改进 时间复杂度为O(log2n)

 

1.思路:(画图实际上更直观看出来思路,读者试着自己画出图来对应分析)

设数组a[start]~a[end],mid = (start + end) / 2 在进行二叉查找时,待查找数肯定会在变量mid的两侧,其中mid的取值主要有以下几情况,

第一种为a[mid] < a[start] 说明此时mid对应的数字在最大数的左边, 第二种为a[start]  > a[end] 说明此时mid对应的数字在最大数的右边,这两种情况对应不同的判断计算方法,详见下面的代码,其他情况不是违反题意就是容易得出结果。

 

2.代码

#include <iostream>using namespace std;int find(int *a ,int x, int max) {int start = 0, end = max - 1;while(start < end - 1){int mid = start + (end - start)/2;if(a[start] == x)return start;if(a[end] == x)return end;if(a[mid] == x)return mid;if(a[mid] < a[start] ){if( x < a[start] && x > a[mid])end = mid ;elsestart = mid ;}else if(a[mid] > a[end]){if( x > a[end] && x < a[mid])start = mid ;elseend = mid ;}else{if (x != a[mid])return -1;elsereturn mid;}}return -1; }int main() {int a[10] = {4, 3, 2, 1, 10 ,9, 8,7, 6, 5};int index = find(a, 8, 10);cout << "index:" << index << endl;return 0; }

 

 

3.执行效果:

 

 

 

 

 

转载于:https://www.cnblogs.com/biyeymyhjob/archive/2012/09/19/2693879.html

总结

以上是生活随笔为你收集整理的在移位数组中查找数的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。