算法学习---基础
tags:算法
二分查找
- 1.1 Java基本编程
- 1.2 数据抽象
- 1.3 背包,队列和栈
- 1.4 算法分析
二分查找
算法
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
算法分析
1,程序接收2个参数,一个有序数组int[] a,一个查找关键字key
2,循环比较数组中间关键字的结果,判断是否在那个区间中
3,不断分割与保存新的数组
st=>start: Start
op=>operation: mid =(a.length-1)/2
cond=>condition: mid=key or mid!=key?
e=>end
st->op->cond
cond(yes)->e
cond(no)->op
自然语言描述
实现一个rank方法,接收2个参数,一个数组int,一个整数键key。如果key存在于数组中则返回它的索引,否则返回-1.
算法使用2个变量lo和hi,并保证如果在数组中则它一定在a[lo,h1]中,然后方法进入一个循环,不断的将数组的中间键mid和key比较,如果相等,则返回mid的索引,否则算法就讲缩减一半,如果key>a[mid],则找a[mid,hi]否则找a[lo,mid],直到a[mid]=key或者为空a[lo,h1]改过程结束。
java代码示例
public class BinarySearch {
/**
*
* @param key 一个被查的key值
* @param a 一个数组
* @return 返回key在数组中的索引
*/
public static int rank(int key, int[] a) {
//init
Arrays.sort(a);
int lo = 0;
int hi = a.length - 1;
while ((lo <= hi) && (lo <= a.length - 1) && (hi <= a.length - 1)) {
int mid = lo + (hi - lo) / 2;
if (key == a[mid]) {
return mid;
} else if (key < a[mid]) {
hi = mid - 1;
} else {
lo = mid + 1;
}
}
return -1;
}
public static void main(String[] args) {
int[] dateList = { 121,88,98, 84, 1, 123, 111 };
Arrays.sort(dateList);
int key = -1;
int keyIndex = rank(key, dateList);
System.out.println(keyIndex);
}
}
结果分析
- [ ] 必须采用顺序存储结构
- [ ] 必须按关键字大小有序排列。
安装书中的代码执行没有成功,调整了一下