算法设计技巧与分析(一):基本算法(上)


基本算法(上)

一、二分查找

在这里插入图片描述

  • 首先选择数组中间的数字和需要查找的目标值比较
  • 如果相等,则直接返回答案
  • 如果不相等
    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)(注意输入输出和辅助数组)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值