zoukankan      html  css  js  c++  java
  • 二分查找

    二分查找的适用数据为有序数列。

    若在一个长度为N的有序数组中使用顺序查找(也就是从头开始一个个找)去找一个数,其时间复杂度会随着数组长度增加而增长,其时间复杂度是O(n),

    而如果我们用二分查找的方法,可以将时间复杂度降为O(logn)。

    其思想为:假设要在长度为N的数组中查找的数值为k,先查看处于数组中间位置mid的数据的数值,若其数值小于k,因为该数组是有序数组,我们可以确定接下来的查找范围会在mid+1到N-1之间,

    同理,若处于mid位置的数值大于k,则接下来查找的范围变为0到mid-1之间。然后重新查看下一个范围的中间位置的值,开始同样的迭代,直到找到我们要找的k值的位置。

                                                                                                                                                                         图1

    接下来献上我的C++实现代码

    头文件Sort.h:

    //自己编写的各种排序算法的头文件。
    #ifndef _SORT_H
    #define _SORT_H
    //冒泡排序
    class bubble_sort{
    private:
        int *Array,Length;
    public:
        bubble_sort(int *Array1,int Length);
        int *sort_bubble();
    
    };
    //归并排序
    class merge_sort{
    public:
         static void sort_merge(int Array1[], int Array2[], int Left, int Rightend, int Right,int recursion);
         static void Merge(int Array1[], int Array2[], int Left, int Rightend);//递归方法
         static void Merge_pass(int Array1[], int Array2[], int ordered_len,int Length);
         static void Merge1(int Array1[], int Array2[], int Length);//非递归方法
    };
    //快速排序
    class quick_sort{
    public:
        static void sort_quick(int Array1[],int Left,int right);
        
    };
    //二分查找
    class binary_search{
    public:
        static int search_binary(int Array[],int low,int high,int e);
    };
    #endif

    search_binary.cpp:

    //采用递归方式
    #include "Sort.h";
    int binary_search::search_binary(int Array[], int low, int high, int e)
    {
        
            int mid = (low + high) / 2;
            if (Array[mid] == e)
                return mid;
            /*因为int类型相邻大小的两个数的均值为较小的数,
            在数组中找不到e的时候有可能出现low>high的情况,
            因此判断条件为high<=low。*/
            if (high <= low)
                return -1;
            if (Array[mid] > e)
                return search_binary(Array, low, mid - 1, e);
            else
                return search_binary(Array, mid + 1, high, e);
    }

    main.cpp:

    /**********************
         递归二分查找
    **********************/
    #include <iostream>
    #include "Sort.h"
    using namespace std;
    void main()
    {
        int Array[10] = { 3, 4, 7, 8, 10, 15, 17, 19, 30, 31 };//有序数列。
        int e = 34;//将要查找的数。
        int N = sizeof(Array) / sizeof(int);
        int location = binary_search::search_binary(Array, 0, N - 1, e);
        cout << location << endl;
        system("pause");
    }

    通过二分查找,对一个有序数列的查找效率将大大提高。

    欢迎各位大佬点评指正。

  • 相关阅读:
    Spring Boot (20) 拦截器
    Spring Boot (19) servlet、filter、listener
    Spring Boot (18) @Async异步
    Spring Boot (17) 发送邮件
    Spring Boot (16) logback和access日志
    Spring Boot (15) pom.xml设置
    Spring Boot (14) 数据源配置原理
    Spring Boot (13) druid监控
    Spring boot (12) tomcat jdbc连接池
    Spring Boot (11) mybatis 关联映射
  • 原文地址:https://www.cnblogs.com/leo-lv/p/10656027.html
Copyright © 2011-2022 走看看