数据结构(1)有序表查找

 有序表查找

	/*  主函数  */
	public class OrderTableSearch {
		public static void main(String[] args) {
			int [] a= {0,1,16,24,35,47,59,62,73,88,99};	
			System.out.println(FibonacciSearch(a, 10, 88));
			System.out.println(InsertKeySearch(a, 10, 88));
			System.out.println(BinarySearch(a, 10, 88));
		}

一、折半查找 

		/* 折半查找  */
		/* 输出:9 */
		static int BinarySearch(int [] a, int n, int key){
			int low, high, mid;
			low = 0;
			high = n;
			while(low <= high){
				mid = (low + high) / 2; /* 折半  */
				if (key < a[mid]){
					high = mid - 1;
				}
				else if (key > a[mid]){
					low = mid + 1;
				}
				else 
					return mid;
			}
			return 0;
		}

二、插值查找 

		/* 插值排序 */
		/* 输出:9 */
		static int InsertKeySearch(int [] a, int n, int key){
			int low, high, mid;
			low = 0;
			high = n;
			while(low <= high){
				/* 插值查找的计算公式 */
				mid = low + (high - low)*
						(key - a[low])/(a[high] - a[low]);
				if (key < a[mid]){
					high = mid - 1;
				}
				else if (key > a[mid]){
					low = mid + 1;
				}
				else 
					return mid;
			}
			return 0;
		}

三、斐波那契查找 

		/* 斐波那契排序 */
		/* 输出:9 */
		static int FibonacciSearch(int [] a, int n, int key){
			int [] F = {0,1,1,2,3,5,8,13,21,34};
			int low, high, mid, i, k;
			low = 1;
			high = n;
			k = 0;
			while (n > F[k]-1) /* 计算n位于斐波那契数列的位置 */
				k++;
			
			while (low <= high) {
				mid = low + F[k-1] -1;
				if (key < a[mid]){
					high = mid - 1;
					k = k - 1;
				}
				else if (key > a[mid]){
					low = mid + 1;
					k = k - 2;
				}
				else {
					if (mid <= n)
						return mid;
					else
						return n;
				}
			}
			return 0;
		}

四、三种查找方法的比较

  平均性能:斐波那契>折半>插值,因为折半查找是加法与除法的运算,插值为四则运算,斐波那契加减运算。

  

 

转载于:https://www.cnblogs.com/danbing/p/5128089.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值