careercup-排序和查找 11.3
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的更多相关文章
- C++ 排序、查找的应用
// order.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "string.h" #includ ...
- 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 ...
- 006-筛选分类排序搜索查找Filter-Classificatio-Sort-Search-Find-Seek-Locate
006-筛选分类排序搜索查找Filter-Classificatio-Sort-Search-Find-Seek-Locate https://www.cnblogs.com/delphixx/p/1 ...
- Golang的排序和查找
Golang的排序和查找 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.排序的基本介绍 排序是将一组数据,依指定的顺序进行排列的过程.排序的分类如下 1>.内部排序 指将 ...
- UVA.10474 Where is the Marble ( 排序 二分查找 )
UVA.10474 Where is the Marble ( 排序 二分查找 ) 题意分析 大水题一道.排序好找到第一个目标数字的位置,返回其下标即可.暴力可过,强行写了一发BS,发现错误百出.应了 ...
- vector向量容器元素排序与查找
1.利用标准库函数sort()对vector进行排序 参考源码: #include <algorithm> #include <vector> vector<int> ...
- 九度OJ 1174:查找第K小数 (排序、查找)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6376 解决:2539 题目描述: 查找一个数组的第K小的数,注意同样大小算一样大. 如 2 1 3 4 5 2 第三小数为3. 输入: ...
- NumPy 排序、查找、计数
章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基于数值区间创建数组 NumPy 数组切 ...
- 基于python常用排序与查找
""" 排序与查找 -- 冒泡排序 -- 选择排序 -- 快速排序 --****经典 -- 希尔排序 """ # 常用排序的实现 # 冒泡排 ...
- 9.11排序与查找(三)——给定一个排序后的数组,包括n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
/** * 功能:给定一个排序后的数组.包括n个整数.但这个数组已被旋转过多次,次数不详.找出数组中的某个元素. * 能够假定数组元素原先是按从小到大的顺序排列的. */ /** * 思路:数组 ...
随机推荐
- 酷盘kanbox获得B轮2000万美元融资
和阿里近期收购以穷游.虾米为代表的一批小网站相似,酷盘也属于个人用户数量级别庞大,但商业模式并不明晰的企业.目前阿里巴巴集团旗下的阿里云公司拥有自己的云存储业务,其本身既有面向个人用户的产品,也有面向 ...
- vnc执行,报xauth could not run
/usr/bin/gnome-terminal [INFO-10%]生成随机密码 [INFO-20%]生成密码文件 [INFO-30%]完成初始化,准备打开连接 Error: could not ru ...
- spring cloud官方文档提到的服务开发的12项要素。
I. Codebase 从一个代码库部署到多个环境. II. Dependencies 使用显式的声明隔离依赖,即模块单独运行,并可以显式管理依赖. III. Config 在系统外部存储配置信息. ...
- Cocos2d-x CCEditBox & CCTextFieldTTF
下面简单记录一下如何Cocos2d-x中创建输入编辑框.在引擎中为我们提供了这样两个类:CCEditBox 和 CCTextFieldTTF. 一.CCEditBox ①这个类文件的位置 ②这个类 ...
- powerdesigner简单使用
---- 1) --- 新建流程图:新建模型,选择activity的那个就可以了. ----
- bzoj1056
花了一上午大概复习了一下splay,treap 像这种裸的数据结构题在js应该会越来越少 不过练练手也好, 这就是平衡树+hash,如果这是单纯的BST应用,还是写treap吧,好调试 ; ...
- poj 1084 舞蹈链(纠结题)
此题反正我自己是认为poj给的数据范围是有错的,不知道是不是自己太弱了,有大神在的话,欢迎来呸! 其实目的就在于建图,搞的我后来建了一个无比纠结的图,先建立了火柴棍和正方形的一个全图,然后再删除一些火 ...
- Git submodule实战
http://blog.jqian.net/post/git-submodule.html 使用git管理的项目开发中,如果碰到公共库和基础工具,可以用submodule来管理. 常用操作 例如, 公 ...
- wpa_supplicant 与iwpriv工具配置WIFI的命令
=====================================================hostapd 配置命令=================================== ...
- [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.1.1
Given any $k$-tupel of linearly independent vectors $X$ as above, there exists a $k$-tuple $Y$ biort ...