二分查找的适用数据为有序数列。
若在一个长度为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"); }
通过二分查找,对一个有序数列的查找效率将大大提高。
欢迎各位大佬点评指正。