循环有序数组,查找值

一、从一个循环有序数组总查找给定值

  1、思路:先通过中间值和最后一个或者第一个元素比较,找出局部有序范围,再通过二分查找局部有序段

  

private static int sortArrFindOne(int arr[], int low, int high, int target) {
        int mid = (high - low) / 2 + low;
        if (arr[mid] == target) return mid;
        if (arr[mid] < arr[high]) {
            if (arr[mid] < target && target <= arr[high]) {
                return find(arr, mid, high, target);
            } else {
                return sortArrFindOne(arr, low, mid, target);
            }
        } else {
            if (arr[low] <= target && target < arr[mid]) {
                return find(arr, low, mid, target);
            } else {
                return sortArrFindOne(arr, mid, high, target);
            }
        }
    }

  2、找局部有序(二分递归查找)

  

//局部有序
    private static int find(int arr[], int low, int high, int target) {
        int mid = (high - low) / 2  + low;
        if (arr[mid] == target) return mid;
        if (arr[mid] < target) {
            return find(arr, mid + 1, high, target);
        } else {
            return find(arr, low, mid - 1, target);
        }
    }

  3、测试

public static void main(String[] args) {
        int arr[] = {6, 7, 8, 9, 1, 2, 3, 4, 5};
        System.out.println(sortArrFindOne(arr, 0, arr.length - 1, 8));
        System.out.println(sortArrFindOne(arr, 0, arr.length - 1, 1));
        System.out.println(sortArrFindOne(arr, 0, arr.length - 1, 5));
        System.out.println(sortArrFindOne(arr, 0, arr.length - 1, 6));
    }

  

原文地址:https://www.cnblogs.com/junxing/p/11074837.html

时间: 2024-12-26 15:38:24

循环有序数组,查找值的相关文章

KT学算法(二)——循环有序数组查找指定元素

问题描述 一个循环有序的数组是形如:"12,16,18,20,41,100,1,4,6,9" 这样的数组. 问题分析 对于循环有序数组,一种简单的定义是: 循环有序数组是将一个有序数组切成两段,并交换位置得到引用块内容 比如现将1,4,6,9,12,16,18,20,41,100在9和12处切分,得到两段:1,4,6,9和12,16,18,20,41,100,再交换这两段的位置就得到了一开始的循环有序数组. 另一种比较严格的定义是: 对于一个循环有序数组{A1,A2,--An},存在一

[算法] 循环有序数组查找

有序数组二分查找的变形,代码如下: #include<stdio.h> #include<stdlib.h> int main() { int *array = (int *)malloc(sizeof(int)*16); int i; for(i = 0; i < 16; i++) { *(array + i) = (i+5) % 16; } int ret = search(array, 16, 10); printf("%d", ret); retu

[算法] 循环有序数组查找非递归实现

非递归实现 #include<stdio.h>#include<stdlib.h> int isOrdered(int *array, int begin, int end) { return *(array+end) > *(array+begin) ? 1 : 0; } int contains(int *array, int begin, int end, int theNum) { return theNum >= *(array + begin) &&

leetcode——Search a 2D Matrix 二维有序数组查找(AC)

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in each row are sorted from left to right. The first integer of each row is greater than the last integer of the previous ro

二维“有序”数组查找问题的解决

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,诶一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否包含了该整数. 例如下面的二维数组就是每行.没列都递增排序.如果在这个数组中查找数字7,则返回true(找得到):如果查找数字5,由于数组不含该数字,则返回false. 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 如下图所示,会出现三种情况. 数组中选取的数字(图中全黑的位置)刚好是要查找的数字(相等),查找

二分查找思想寻找有序数组中查找最小值

思想:循环有序数组最大的特点是利用二分查找时,有一边总是有序的,利用这个特点,利用value存储历史最小值 当左边有序,则用A[low]与value比较即可得出当前左边的最小值,然后跳转到右边看是否存在更小的: 如果右边有序,则用A[mid]与value比较,得出右边的最小值,然后跳转到左边查看是否有更小的. 算法复杂度为O(logn) 代码如下: #include<iostream> #include<stdio.h> #include<assert.h> using

找出有序数组中绝对值最小的数

问题: 一个有序数组,值有可能有负值,也有可能没有,现需要找出其中绝对值最小的值. 方法1: 遍历数组,找到绝对值最小值,时间复杂度O(n),n为元素个数. 方法2: 二分查找,因为数组有序,可以利用二分查找,时间复杂度O(logn). 分析步骤: 如果第一个数为正数,说明整个数组没有负数,直接返回第一个数 如果最后一个数为负数,说明整个数组没有正数,直接返回最后一个数 数组元素有正有负,说明绝对值最小的元素肯定在正负数交界处,需要二分查找上场: 如果a[mid]<0,因为数组是升序,说明绝对值

不光是查找值! &quot;二分搜索&quot;

2018-11-14 18:14:15 二分搜索法,是通过不断缩小解的可能存在范围,从而求得问题最优解的方法.在程序设计竞赛中,经常会看到二分搜索法和其他算法相结合的题目.接下来,给大家介绍几种经典的二分搜索法的问题. 一.从有序数组中查找某个值 1.lowerBound 问题描述: 给定长度为n的单调不下降数列a和一个数k,求满足ai >= k条件的最小的i.不存在的情况下输出n. 限制条件: 1 <= n <= 10 ^ 6 0 <= ai < 10 ^ 9 0 <

插入元素到有序数组,二分搜索查找插入位置

当一个数组有序时,要向其中插入元素,可以先使用二分搜索查找其要插入的位置,位置确定后可以执行插入操作. 其中二分搜索的循环体如下(部分代码,具体见文章最后): while(low<=high){//循环条件 mid = (low+high)/2; if(a[mid]<val){ low = mid+1; }else if(a[mid]>val){ high = mid-1; }else{ insert(a,last,mid,val);//a[mid]==val,执行插入操作 return