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)/2;
    if(a[mid]==x)
        return mid;
    if(left>right)
        return -1;
    //左半部分有序
    if(a[left]<a[mid])
    {
        if( x>=a[left] && x<=a[mid])
            return searchBinary(a,left,mid-1,x);
        else
            return searchBinary(a,mid+1,right,x);
    }
    else if(a[left]>a[mid])//右半部分有序
    {
        if(x>=a[mid]&&x<=a[right])
            return searchBinary(a,mid+1,right,x);
        else
            return searchBinary(a,left,mid-1,x);
    }
    //可能左半部分有序也可能右半部分有序
    else if(a[left]==a[mid])
    {
        if(a[mid]!=a[right])//左半部分全是重复的元素
            return searchBinary(a,mid+1,right,x);
        else //有可能左半部分也可能右半部分都死重复的元素
        {
            int result=searchBinary(a,left,mid-1,x);
            if(result==-1)
                return searchBinary(a,mid+1,right,x);
            else
                return result;
        }
    }
    return -1;
}
int search(int a[],int n,int x)
{
    return searchBinary(a,0,n-1,x);
}

int main()
{
    int arr[10]={2,2,3,3,4,5,6,7,1,1};
    cout<<search(arr,10,3)<<endl;
}

 

时间: 2024-10-03 00:09:57

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

排序与查找及其应用:设计一个程序,用于查询一个IP所在的机构设计一个程序,用于查询一个IP所在的机构

问题描述 排序与查找及其应用:设计一个程序,用于查询一个IP所在的机构设计一个程序,用于查询一个IP所在的机构 设计一个程序,用于查询一个IP所在的机构.具体要求:1. 设计一个函数,用于比较两个IP地址(字符串)的大小, 2. 从外部数据文件(IP.TXT)中读取IP数据; 3. 用平衡二叉排序树存储IP及其所属机构名称;4. 输入一个IP地址,查找并输出与此IP对应的机构名称; 5. 输入一个机构名称,查询与此机构对应的的IP地址; 解决方案 算法部分可以使用STL. 解决方案二: #inc

class-编写一个使用类模板对数组进行排序、查找和求元素和的程序。

问题描述 编写一个使用类模板对数组进行排序.查找和求元素和的程序. 设计一个类模板templateclass Array,用于对T类型的数组进行排序.查找和求元素和,然后由此产生模板类Array和Array. 解决方案 http://www.warting.com/program/201109/33601.html 第四题 解决方案二: 编写一个使用类模板对数组进行排序,查找和求元素和的程序.

编程-数组类模板Array,类中包括对数组进行排序、查找和求元素和 然后由此产生模板类Array&amp;amp;lt;Box&amp;amp;gt;

问题描述 数组类模板Array,类中包括对数组进行排序.查找和求元素和 然后由此产生模板类Array<Box> #include using namespace std;class Box{private: int a b c;public: int V; Box(int chint kint g) { a = ch; b = k; c = g; V = a*b*c; } bool operator <(Box &one) { int temp = V - one.V; if (

PHP常用的排序和查找算法_php技巧

本文汇总了常见的php排序算法和查找,在进行算法设计的时候有不错的借鉴价值.现分享给大家供参考之用.具体如下: <?php /** * PHP最常用的四个排序方法及二种查找方法 * 下面的排序方法全部都通过测试 * auther : soulence * date : 2015/06/20 */ //PHP冒泡排序法 function bubbleSort(&$arr){ //这是一个中间变量 $temp=0; //我们要把数组,从小到大排序 //外层循环 $flag=false;//这个优

数据结构 排序和查找

#include <stdio.h> #include <stdlib.h> #include <time.h> const int ITEMNUM = 100; #define ElemType int //冒泡排序 void Bubblesort(ElemType R[],int n,int &comp_num,int &move_num) {  int i,j,flag=1;     //当flag为0,则停止排序  ElemType temp;

有数据绑定、排序、查找功能的ListView(二):

排序|数据 using System;using System.Data;using System.Text;using System.Globalization;using System.Collections;using System.Reflection; using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Design; using System.Windows.Forms;using Syst

careercup-排序和查找 11.5

11.5 有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串的位置. 解法: 如果没有那些空字符串,就可以直接使用二分查找法.比较待查找字符串str和数组的中间元素,然后继续搜索下去.针对数组中散布一些空字符串的情形,我们可以对二分查找法稍作修改,所需的修改就是mid进行比较的地方,如果mid为空字符串,就将mid换到离它最近的非空字符串的位置.   C++实现代码: #include<iostream> #include<string> #include

careercup-排序和查找 11.6

11.6 给定M*N矩阵,每一行.每一列都按升序排序,请编写代码找出某元素. 类似leetcode:Search a 2D Matrix 但是与leetcode中这题不同的是下一行的第一个元素不一定大于上一行的最后一个元素.所以使用二分查找有点麻烦. 解法一:通过观察我们可知: 若列的开头大于x,那么x位于该列的左边: 若列的末端小于x,那么x位于该列的右边: 若行的开头小于x,那么x位于改行的上方: 若行的末端小于x,那么x位于改行的下方 我们可以从任意位置开始搜索,不过,让我们从列的起始元素

有数据绑定、排序、查找功能的ListView(一)

排序|数据 本控件纯粹为练习用,所以没有考虑使用DataGrid代替.该控件不足的地方:1.当父窗体运行后,DataSet被填充时,ListViewEx不能自动判断该种情况,只能通过CurrencyManager的ItemChanged的事件来调用填充ListViewItem的函数,有时该事件会被调用两次,ListViewEx则要填充两次.2.对于FindItem中,按照ListViewItem的Text查找 ListViewItem的方法,记得有一个API可以调用,但是没有实现,只能暂时使用循