二分查找

来源:互联网 发布:淘宝优惠券链接转换器 编辑:程序博客网 时间:2024/05/22 01:57
学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度。

时间复杂度按优劣排差不多集中在:

O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n)

到目前位置,似乎我学到的算法中,时间复杂度是O(log n),好像就数二分查找法,其他的诸如排序算法都是 O(n log n)或者O(n2)。但是也正是因为有二分的 O(log n), 才让很多 O(n2)缩减到只要O(n log n)。

关于二分查找法
二分查找法主要是解决在“一堆数中找出指定的数”这类问题。

而想要应用二分查找法,这“一堆数”必须有一下特征:

存储在数组中
有序排列
所以如果是用链表存储的,就无法在其上应用二分查找法了。(曽在面试被问二分查找法可以什么数据结构上使用:数组?链表?)

至于是顺序递增排列还是递减排列,数组中是否存在相同的元素都不要紧。不过一般情况,我们还是希望并假设数组是递增排列,数组中的元素互不相同。

(以上部分为转载)

对于递增数组,二分排序递归实现如下:

int besearch(int arr[], int low, int high, int target ){if (low > high){return -1;}int mid = (low + high) / 2;if (target < arr[mid])return besearch(arr, low, high - 1, target);else if (target > arr[mid])return besearch(arr, high + 1, high, target);elsereturn mid;}
对于递增数组,二分查找非递归实现如下:
int besearch2(int arr[], int low, int high, int target){if (low > high || target > high){return -1;}while (low != high){int mid = (low + high) / 2;if (target < arr[mid])high = mid;else if (target > arr[mid])low = mid;elsereturn mid;}return -1;}



0 0
原创粉丝点击