二分查找

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

若在一个长度为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");
}

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

欢迎各位大佬点评指正。

posted @ 2019-04-04 17:20  十面埋伏但莫慌  阅读(246)  评论(0编辑  收藏  举报