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");
    }

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

    欢迎各位大佬点评指正。

  • 相关阅读:
    【linux】which和whereis
    【linux】locate介绍
    【linux】find命令详解
    【linux】umask
    【linux】文件目录说明
    【linux】Linux系统信息查看命令大全
    【linux】mkdir -p命令
    【linux】head&&tail
    【linux】less &&more
    【linux】ls常用参数
  • 原文地址:https://www.cnblogs.com/leo-lv/p/10656027.html
Copyright © 2011-2022 走看看