(二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>

using namespace std;

/**

* 从有序递增旋转数组45679123 中找到数字6的位置

* 数组递增 但有旋转

* 二分查找思想

* 时间复杂度小于O(N)

* {7,8,9,10,1,2,3,4,5,6}

*************/

int find_revolve_array(const int arr[], int len, int value)

{

if (NULL == arr || len < 0)

{

throw exception("Invalid input");

return 0;

}

int left = 0;

int right = len - 1;

int mid = -1;

while (left <= right)

{

mid = (left - right) / 2 + right; // 不要用 left / 2 + right / 2   因为(5 + 7)/2 = 6  而 (5/2 + 7/2) = 5

// 9/2 + 9/2 = 8   遇不见最后一个数 可能死循环

if (arr[mid] == value)

{

return mid;

}

else if (value < arr[mid])

{

if (value >= arr[left]) // 在左边

{

right = mid -1;

}

else // 在右边

{

left = mid + 1;

}

}

else

{

if (value <= arr[right])

{

left = mid + 1;

}

else

{

right = mid - 1;

}

}

}

return -1;

}

void test()

{

int arr[] = {7,8,9,10,1,2,3,4,5,6};

int index = find_revolve_array(arr, 10, 7);

}

int main()

{

test();

return 0;

}

时间: 2024-08-09 06:43:37

(二分查找思想)从有序递增旋转数组45679123 中找到数字6的位置的相关文章

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

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

二分查找思想

二分查找 ??二分查找思想应用于对有序的数组进行查找操作. 时间复杂度 ??二分查找也称为折半查找,每次都能将查找区间减半,这种折半特性算法时间复杂度为O(logn). mid计算 有两种计算中值mid的方式: m=(l+h)/2 m=l+(h-l)/2 ??l+h可能出现加法溢出,也就是说加法的结果大于整形能够表示的范围.但是l和h都为正数,因此h-l不会出现加法溢出的问题.所以,最好使用第二种计算方法. 变种 二分查找可以有很多变种,变种实现要注意边界值的判断.例如在一个有重复元素的有序数组

二分查找(针对有序数组)

9/10/2017,简写一个封装好的二分查找,适用于C/C++ 正文如下: int Binary_search(DateType *a,DateType K,const DateType n) { int beg = 1,end = n; mid = beg + (end - beg)/2; while((mid != end) && (a[mid] != K)) { if(a[mid] < K) beg = mid + 1; else end = mid; mid = beg +

二分查找:在有序数组中搜索大于等于x的数的最小下标

标准的二分查找,大家可能都已经能记在脑海里了,但是稍微变形一下,可能就会出问题. 本文写了一个二分查找算法,并且做了一个测试的脚手架,用二分查找和普通算法的结果进行比较来验证算法的正确性. 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int find(int a[],int n ,int x) 5 { 6 int i=0,j=n-1; 7 int ret=-1; 8 while(i<j) 9

c语言二分法查找数组中一个数字的下标位置

int binary_search(int arr[], int k, int left, int right) { //int right = sizeof(arr) / sizeof(arr[0]) - 1;放在这里错误,arr是指针,长度为4个字节,right=0 while (left <= right) { int mid = left + (right - left) / 2;//每次都要改变,所以要循环 if (arr[mid] > k) { right = mid - 1; }

使用二分查找向一个有序数组中插入一个数据

折半查找法找到一个元素在数组中的下标 * @param arr 数组 * @param key 要查找的元素 * @return 找到则返回元素在数组中的下标,如果没找到,则返回这个元素在有序数组中的位置 * 如:[1,4,6,7,10,11,15],查找8在数组中的位置,如果存在则返1,不存在则返回在7这个下标+1的这个位置上, 也就是说在返回10所在位置上的下标 */ public static int arrayIndexOf(int[] array,int key) { int min,

[LeetCode]Median of Two Sorted Arrays 二分查找两个有序数组的第k数(中位数)

二分.情况讨论 因为数组有序,所以能够考虑用二分.通过二分剔除掉肯定不是第k位数的区间.如果数组A和B当前处理的下标各自是mid1和mid2.则 1.假设A[mid1]<B[mid2], ①.若mid1+mid2+2==k(+2是由于下标是从0開始的),则 mid1在大有序数组中下标肯定小于k,所以能够排除[0,mid1].此外.B[mid2]下标大于或等于k.能够排除[mid2+1,n]: ②.若mid1+mid2+2<k,则 mid1在大有序数组中下标肯定小于k,所以能够排除[0,mid1

Leetcode 162 Find Peak Element (二分查找思想)

A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ num[i+1], find a peak element and return its index. The array may contain multiple peaks, in that case return the index to any one of the peaks is fi

旋转有序数组的二分查找

要求 给定一个没有重复元素的旋转数组(它对应的原数组是有序的),求给定元素在旋转数组内的下标(不存在的返回-1). 例子 有序数组{0,1,2,3,4,5,6,7}对应的旋转数组为{3,4,5,6,7,0,1,2}(左旋.右旋效果相同). 查找元素5,返回结果2: 查找元素8,返回结果-1. 分析 可以轻易地想到遍历一遍O(n)时间可以得到结果,但是并不是最好的结果:利用有序的特点,可以轻易的想到二分查找的方法.经过旋转后的数组总是可以分为两个有序序列,如下图所示.旋转数组分成了红蓝两段有序序列