zoukankan      html  css  js  c++  java
  • 循环有序数组查找(log(n))

    参考地址: http://blog.sina.com.cn/s/blog_6d50a05801016092.html

    问题:

    一个循环有序数组(如:3,4,5,6,7,8,9,0,1,2),不知道其最小值的位置,要查找任一数值的位置。要求算法时间复杂度为log2(n)。

    问题分析:

        我们可以把循环有序数组分为左右两部分(以mid = (low+high)/ 2为界),由循环有序数组的特点知,左右两部分必有一部分是有序的,我们可以找出有序的这部分,然后看所查找元素是否在有序部分,若在,则直接对有序部分二分查找,若不在,对无序部分递归调用查找函数

    #include <iostream>
    #include <stdio.h>
    
    int binarySearch(int a[], int l, int r, int k)
    {
        if(l>r) return -1;
        int mid = (l+r) / 2;
        if(a[mid] == k) return mid;
    
        if(a[mid] < k)
            return binarySearch(a, mid+1, r, k);
        else
            return binarySearch(a, l, mid-1, k);
    }
    
    int Search(int a[], int l, int r, int k)
    {
        if(l>r) return -1;
        int mid = (l+r)/2;
        if(a[l] < a[mid])    //左边有序
        {
            if(a[l]<=k && k <= a[mid])
                return binarySearch(a, l, mid, k);
            else
                return Search(a, mid+1, r, k);
        }
        else    //右边有序
        {
            if(a[mid]<=k && k<=a[r])
                return binarySearch(a, mid, r, k);
            else
                return Search(a, l, mid-1, k);
        }
    }
    
    int main()
    {
        int a[10] = {4,5,6,7,8,9,0,1,2,3};
        printf("%d\n", Search(a, 0, 9, 7));
        return 0;
    }

     

  • 相关阅读:
    MariaDB · 版本特性 · MariaDB 的 GTID 介绍
    stm8s 中断重复进入
    PCB积累
    链表的创建、增加、删除、改数据、遍历
    百度文库文字下载工具指引
    防倒灌的开关电路
    AD快速从原理图查找pcb中元件
    三目运算符填坑
    嵌入式结构化分层思想
    原码,反码,补码
  • 原文地址:https://www.cnblogs.com/wouldguan/p/2772317.html
Copyright © 2011-2022 走看看