11.3 给定一个排序后的数组,包含n个整数,但这个数组已被旋转很多次,次数不详。请编写代码找出数组中的某个元素。可以假定数组元素原先是按从小到大的顺序排序的。

解法:

可以直接从开始一个一个比较,也可以采用二分查找的方法。

在经典二分查找中,我们会将x与中间元素进行比较,以确定x属于左半部分还是右半部分。此题的复杂之处在于数组被旋转过,可能有一个拐点。

不过在左右两边至少有一边是有序的,因此我们可以看看按正常顺序排列的那一半数组,确定应该搜索左半部分还是右半部分。

但是如果左侧元素和中间元素完全相同,我们可以检查是否和左右边的元素相同,如果不同,说明左半部分是完全重复的元素,右半部分是升序排序的。但是如果和最右边元素相同,此时右半部分和左半部分都可能是有序或者重复的,因此需要两边都进行搜索。

C++实现代码:

#include<iostream>
using namespace std; int searchBinary(int a[],int left,int right,int x)
{
int mid=(left+right)/;
if(a[mid]==x)
return mid;
if(left>right)
return -;
//左半部分有序
if(a[left]<a[mid])
{
if( x>=a[left] && x<=a[mid])
return searchBinary(a,left,mid-,x);
else
return searchBinary(a,mid+,right,x);
}
else if(a[left]>a[mid])//右半部分有序
{
if(x>=a[mid]&&x<=a[right])
return searchBinary(a,mid+,right,x);
else
return searchBinary(a,left,mid-,x);
}
//可能左半部分有序也可能右半部分有序
else if(a[left]==a[mid])
{
if(a[mid]!=a[right])//左半部分全是重复的元素
return searchBinary(a,mid+,right,x);
else //有可能左半部分也可能右半部分都死重复的元素
{
int result=searchBinary(a,left,mid-,x);
if(result==-)
return searchBinary(a,mid+,right,x);
else
return result;
}
}
return -;
}
int search(int a[],int n,int x)
{
return searchBinary(a,,n-,x);
} int main()
{
int arr[]={,,,,,,,,,};
cout<<search(arr,,)<<endl;
}

careercup-排序和查找 11.3的更多相关文章

  1. C++ 排序、查找的应用

    // order.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "string.h" #includ ...

  2. leetcode题解:Search in Rotated Sorted Array(旋转排序数组查找)

    题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7  ...

  3. 006-筛选分类排序搜索查找Filter-Classificatio-Sort-Search-Find-Seek-Locate

    006-筛选分类排序搜索查找Filter-Classificatio-Sort-Search-Find-Seek-Locate https://www.cnblogs.com/delphixx/p/1 ...

  4. Golang的排序和查找

    Golang的排序和查找 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.排序的基本介绍 排序是将一组数据,依指定的顺序进行排列的过程.排序的分类如下 1>.内部排序 指将 ...

  5. UVA.10474 Where is the Marble ( 排序 二分查找 )

    UVA.10474 Where is the Marble ( 排序 二分查找 ) 题意分析 大水题一道.排序好找到第一个目标数字的位置,返回其下标即可.暴力可过,强行写了一发BS,发现错误百出.应了 ...

  6. vector向量容器元素排序与查找

    1.利用标准库函数sort()对vector进行排序 参考源码: #include <algorithm> #include <vector> vector<int> ...

  7. 九度OJ 1174:查找第K小数 (排序、查找)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6376 解决:2539 题目描述: 查找一个数组的第K小的数,注意同样大小算一样大.  如  2 1 3 4 5 2 第三小数为3. 输入: ...

  8. NumPy 排序、查找、计数

    章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基于数值区间创建数组 NumPy 数组切 ...

  9. 基于python常用排序与查找

    """ 排序与查找 -- 冒泡排序 -- 选择排序 -- 快速排序 --****经典 -- 希尔排序 """ # 常用排序的实现 # 冒泡排 ...

  10. 9.11排序与查找(三)——给定一个排序后的数组,包括n个整数,但这个数组已被旋转过多次,找出数组中的某个元素

    /**  * 功能:给定一个排序后的数组.包括n个整数.但这个数组已被旋转过多次,次数不详.找出数组中的某个元素.  * 能够假定数组元素原先是按从小到大的顺序排列的.  */ /** * 思路:数组 ...

随机推荐

  1. Altium Designer学习: 允许闭合回路

    使用AltiumDesigner画PCB时,顶层和底层都有电源线走 但是通过过孔链接的,主要是因为我这里可使用了几个相同的电源接口,把这些上下层的电源接口连在一起就很容易画出闭合回路,这自身没有太大的 ...

  2. 【Quick 3.3】资源脚本加密及热更新(一)脚本加密

    [Quick 3.3]资源脚本加密及热更新(一)脚本加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.脚本加密 quick框架已经封装好加密模块,与加密有关的文件在引擎目录/quic ...

  3. 近期刷题的c语言总结。

    首先是三个数学函数... /* 函数名: floor 功 能: 下舍入,返回小于或者等于指定表达式的最大整数 说明:返回x的下限,如74.12的下限为74,-74.12的下限为-75.返回值为floa ...

  4. bzoj1040

    论环形dp的重要! 其实这个环比较简单,稍微分析一下就知道, 这是一个简单环,并且每个联通块里只含有一个. 我觉得把处理环的关键,就是要找出环形和线形(树形)有什么区别. 如果我们从某处断开的做dp的 ...

  5. sougou输入法小技巧

  6. [编译] g++ 与 Makefile

    g++ -c CppSoureFile -o ObjectCodeFile -c 编译而不链接 -lm 链接数学库 -static 生成静态链接的程序

  7. js中字符串转换为日期和比较大小

    本文转载于:http://yun342173024.iteye.com/blog/1873756在做前端校验的时候,要做日期比较的校验,在js中把字符串转化为日期,一时之间还真不知道在js中怎么把一个 ...

  8. while MyJob = '程序员' do --- 序

    因为自己的际遇,忽然想写点什么留在这个世上.也许只是想证明自己活过吧. 所以,这不会是一个过去时的小说,这将是一个接近进行时的记叙.之所以是接近,因为我只有在空余时间,才能记录最近的经历.出于保护隐私 ...

  9. Windows下Lua+Redis 断点调试环境搭建==Linux下类似

    Lua+Redis 断点调试环境搭建 windows环境,使用Redis,写lua脚本头疼的问题之一不能对脚本断点调试,google加上自己的摸索,终于搞定. 1.下载ZeroBraneStudio, ...

  10. nyoj 56 阶乘中素数的个数

    给定两个数m,n,其中m是一个素数. 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m. 输入 第一行是一个整数s(0<s<=100),表示测试数据的组数随后的 ...