算法整理-二分查找和排序

1.  二分查找

(1) 有序数组查找插入位置:  主要是终止条件的判断,如果查找不到需要被范围的插入位置为begin

public:
    int searchInsert(vector<int>& nums, int target) {
        int len = nums.size();
        return binarySearch(nums, target, 0, len-1);
    }
private:
    int binarySearch(vector<int>& nums, int target, int begin, int end) {
         if (begin > end) {
             return begin;
         }
         int mid = (begin + end) / 2;
         if (target == nums[mid]) return mid;
         else if (target < nums[mid])
         {
             return binarySearch(nums, target, begin, mid - 1);}
         else
         {
             return binarySearch(nums, target, mid+1, end);}

    }

(2) rotated array 寻找最小值

第一种情况: 不包含重复数字,

class Solution {
public:
    int findMin(vector<int>& nums) {
        int len = nums.size();
        return bsearch(nums, 0, len-1);
    }
private:
   int bsearch(const vector<int> nums, int s, int e){
       if (s >= e) return nums[s];
       int mid = (s + e) / 2;       // 在左侧数组上
       if (nums[mid] > nums[e]) return bsearch(nums, mid+1, e);       // 在右侧数组上
       else return bsearch(nums, s, mid);
   }
};

(3) rotated array 寻找某个值,允许重复:

分成三种情况,(1) 是递增数组 (2) num[s] == num[mid] = nums[e]    用O(n)的时间顺序查找

(3)两段数组的类型, 二分查找,先判断mid是在哪一段数组上

class Solution {
public:
    bool search(vector<int>& nums, int target) {
        int len = nums.size();
        if(len == 0) return false;
        return bsearch(nums, target, 0, len - 1);
    }
private:
    bool bsearch(const vector<int>& nums, int target, int s, int e){
        if ( s > e) {
            return false;
        }
        if (cornercase(nums, s, e)){
           return asearch(nums, target, s, e);
        } 

        if (nums[s] >= nums[e]){
             int mid = (s + e) / 2;
             if (nums[mid] == target) return true;
             if (nums[mid] >= nums[s]) { // mid在左边序列
                 // target比mid大一定在右边序列
                 if (target > nums[mid]) return bsearch(nums, target, mid+1, e);
                 // t比mid小,当t大于end则一定在左侧
                 else if (target > nums[e]) return bsearch(nums, target, s, mid-1);
                 else if (target < nums[e]) return bsearch(nums, target, mid+1, e);
                 else return true;
             }
             if (nums[mid] < nums[s]) {// mid在右边序列
                 if (target < nums[mid]) return bsearch(nums, target, s, mid-1);
                 else if(target > nums[e]) return bsearch(nums, target, s, mid-1);
                 else if(target < nums[e]) return bsearch(nums, target, mid+1, e);
                 else return true;
             }
        }
       return false;
    }

    bool cornercase(const vector<int>& nums, int s, int e){
        int mid = (s + e) / 2;
        if (nums[s] == nums[e] && nums[mid] == nums[s]){
            return true;
         }
        if (nums[s] <= nums[e] && nums[mid] >= nums[s]){
            return true;
        }
        return false;
    }

    bool asearch(const vector<int>& nums, int target, int s, int e){
        for (int i = s; i <=e; i++){
               if (nums[i] == target) return true;
        }
        return false;
    }
};

原文地址:https://www.cnblogs.com/cookcoder-mr/p/11080055.html

时间: 2024-08-05 20:33:02

算法整理-二分查找和排序的相关文章

算法系列&lt;二分查找&gt;

二分查找又称折半查找,是针对有序顺序表的查找,前提:数据是顺序存储的,已经按照关键词进行升序排序.查找成功返回索引值,查找不成功返回-1. 下面用java来实现二分查找算法: /** * 二分查找:针对已排好序的序列,查找成功返回所在位置的索引值,查找不成功返回-1 * 查找的最好时间复杂度:O(1),最坏时间复杂度O(logN),平均时间复杂度:O(logN) * 测试case: * case1:{1} 查找1 * case2:{1} 查找2 * case3:{} 查找1 * case4:{1

查找算法:二分查找、顺序查找

08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205 查找算法 查找算法是在存在的序列(list) 中查找特定的目标(target),要求序列中每个记录必须与一个关键词(key)关联才能进行查找. 查找算法通常需要两个输入: 1.被查找的序列 2.要查找的关键词 查找算法的输出参数和返回值: 1.返回类型为 Error_co

【数据结构与算法】二分查找

基本思想 首先将给定的值K与表中中间位置元素比较,若相等,则查找成功:若不等,则所需查找的元素只能在中间数据以外的前半部分或者后半部分,缩小范围后继续进行同样的查找,如此反复,直到找到为止. 代码实现 /** * 源码名称:BinarySearch.java * 日期:2014-08-14 * 程序功能:二分查找 * 版权:[email protected] * 作者:A2BGeek */ public class BinarySearch { public static int binaryS

算法学习——二分查找(折半查找)

算法学习--二分查找 注意点 1. 二分查找的前提是有序的数组 2. 建议使用[start,end)的区间寻找,符合规范 3. 使用的是递归法 递归的人口 private static int find(int[] temp, int x) { //如果要查找的数x比数组的最后一个数要大,则找不到数值,返回-1 if (x > temp[temp.length - 1]) { return -1; } return find(temp, 0, temp.length, x);//进入递归 } 递

常见算法之二分查找

1.算法思想 二分查找采用分而治之的思想.要求被查找的集合必须是有序的.主要思路: 根据起始位置和结束位置,确定中间位置. 拿目标值与中间位置的值做比较,假如目标值大于中间位置取值,则起始位置为中间位置加1. 假如目标值小于中间位置取值,则结束位置为中间位置减1. 直至起始位置小于等于结束位置,找到目标值的位置即索引. 2.代码实现 2.1.基于Python3.x实现 代码如下: 1 #coding:utf-8 2 def half_search(lst,key): 3 start = 0 4

Java学习 (七)、数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

一.常用数组查找算法 工作原理:它又称为顺序查找,在一列给定的值中进行搜索,从一端的开始逐一检查每个元素,知道找到所需元素的过程. 例1:查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1 1 import java.util.Scanner; 2 public class LinearSearch{ 3 public static void main(String []argas) 4 { 5 int [] array={10,100,90,65,80,92}; 6 System.o

Java笔记(07):常见对象--StringBuffer、二分查找及排序算法

1.StringBuffer类的构造方法 1 package cn.itcast_01; 2 3 /* 4 * 线程安全(多线程讲解) 5 * 安全 -- 同步 -- 数据是安全的 6 * 不安全 -- 不同步 -- 效率高一些 7 * 安全和效率问题是永远困扰我们的问题. 8 * 安全:医院的网站,银行网站 9 * 效率:新闻网站,论坛之类的 10 * 11 * StringBuffer: 12 * 线程安全的可变字符串. 13 * 14 * StringBuffer和String的区别? 1

python几种排序算法和二分查找方法的实现

一.算法概念 - 含义:算法就是对问题进行处理且求解的一种实现思路或者思想. 评判程序优劣的方法 - 消耗计算机资源和执行效率(无法直观) 计算算法执行的耗时(不推荐,因为会受机器和执行环境的影响) 时间复杂度(推荐) 时间复杂度 - 评判规则:量化算法执行的操作/执行步骤的数量, - 如下列 def sumOfN(n): # 执行一步: theSum = 0 for i in range(1,n+1): # 下式一共执行n步,for循环不算一步,因为它是控制循环次数的 theSum = the

(算法:二分查找)在排序数组中,找出给定数字出现的次数

题目: 在排序数组中,找出给定数字出现的次数 思路: 既然出现排序数组,很容易想到二分查找,时间复杂度为O(logn): 先通过二分查找找到最左边出现该数字的下标left(如果没找到,则返回-1),然后通过二分查找找到最右边出现该数字的下表right(如果没找到,则返回-1),然后right-left+1就是出现的次数: 代码: #include <iostream> using namespace std; int BinarySearchCount(int *array,int len,i