【算法学习】02---二分算法总结

算法学习---基础

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);
	}

}

结果分析

posted @ 2017-05-17 16:22  hylinux  阅读(189)  评论(0编辑  收藏  举报