基本算法(上)
一、二分查找
- 首先选择数组中间的数字和需要查找的目标值比较
- 如果相等,则直接返回答案
- 如果不相等
1、如果中间的数字大于目标值,则中间数字向右的所有数字都大于目标值,全部排除
2、如果中间的数字小于目标值,则中间数字向左的所有数字都小于目标值,全部排除
算法伪代码如下:
Input:升序数组a[n]
Output:查找的位置j
low = 1;
high = n;
j = 0;
while(low <= high & j=0):
mid = (low+high)/2;
if a[mid] < x:
low = mid + 1;
else if a[mid] > x:
high = mid - 1;
else:
j = mid;
二分查找是一种高效的查找算法,当数据规模为n,由于每次迭代数据都会缩小为原来的一般,所以被查找区间的大小变化依次为:n, n/2, n/4, n/8, …, n/2^k, …。也就是按等比数列的形式缩小。由于当数据量大小为1时,停止迭代,所以,另n/2^k = 1,即可计算出总共迭代次数为k = logn。而时间复杂度无非就是循环次数,所以时间复杂度为O(logn)。
同时,当n不被2整除时,比较次数为:⌊logn⌋+1。
二、合并两个有序表
算法伪代码如下:
Input:两个有序表A[p...q],A[q+1...r]
Output:有序表A[p...r]
B[p...r]=0;
s = p;
k = q+1;
j = p;
while(s<=q & k<=r)://谁小放谁
if A[s] < A[k]:
B[j] = A[s]
s++:
j++;
else
B[j] = A[k]
k++:
j++;
if s = q+1 :
B[j...r] = A[k...r]
else:
B[j...r] = A[s...q]
A[p...r] = B[p...r]
当两个数组的大小分别为m和n且m≤n时,算法的比较次数为介于m与m+n-1之间。元素的赋值次数即为2(m+n)(注意输入输出和辅助数组)。