查找-有序表查找

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/toward_south/article/details/89481144

有序表查找,首先是表内有序,它有以下算法

1.折半查找

2.插值查找

3.斐波那契查找

Java代码实现:

/*
 *有序表查找 
 */

public class OrderListSearch {
	

	/*
	 * 折半查找
	 * 时间复杂度为O(logn)
	 * 
	 * @param a 数组
	 * @param n 数组大小
	 * @param key 要查找的关键字
	 * @return 返回查找的位置
	 */
	public static int binarySearch(int[] a, int n, int key) {
		
		int low = 0;
		int high = n-1;
		int mid =0;
		
		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;
	}
	
	/*
	 * 插值查找-根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,核心是插值的计算公式
	 * key-a[low]/a[high]-a[low]
	 * 时间复杂度为O(logn)
	 * 
	 * @param a 数组
	 * @param n 数组大小
	 * @param key 要查找的关键字
	 * @return 返回查找的位置
	 */
	public static int interpolationSearch(int[] a, int n, int key) {
		
		int low = 0;
		int high = n -1;//如果这里high = n 会导致数组越界,而折半查找却没有这个问题
		int mid = 0;
		
		while(low <= high) {
			mid = (int)(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;
	} 
	
	/*
	 * 斐波那契查找-利用了黄金分割的原理来实现
	 * 时间复杂度为O(logn)
	 * 
	 * @param a 数组
	 * @param n 数组大小
	 * @param f 斐波那契数列
	 * @param key 要查找的关键字
	 * @return 返回查找的位置 
	 */
	public int fibonacciSearch(int[] a,int n,int[] f, int key) {
		int low = 0;
		int high = n-1;
		int mid = 0;
		int k = 0;
		//计算n位处于斐波那契数列的位置
		while(n > f[k -1]-1) {
			k++;
		}
		
		//将不满的数值补全
		for(int i = n;i<f[k]-1;i++) {
			a[i] = a[n];
		}
		
		while(low <= high) {
			mid = low +f[k-1]-1;
			if(key < a[mid]) {
				high = mid -1;
				k--;
			}
			else if(key > a[mid]) {
				low = mid +1;
				k -= 2;
			}
			else {
				if(mid <= n) {
					return mid;
				}
				//说明是补全数值
				else {
					return n;
				}
			}
		}
		return 0;
	}
	
	/*
	 * 斐波那契数列实现-动态规划
	 * @param n 当前序号
	 * @param 返回当前序号的值
	 */
	public static int fibonacci(int n) {
		if(n <= 0) {
			return 0;
		}
		int[] f= new int[n+1];
		f[0] = 0;
		f[1] = 1;
		for(int i = 2; i <= n;i++) {
			f[i] = f[i-1]+f[i-2];
		}
		return f[n];
	}

	/*
	 * 斐波那契数列实现-递归
	 * @param n 当前序号
	 * @param 返回当前序号的值
	 */
	public static int fibonacci2(int n) {
		if(n <= 0) {
			return 0;
		}
		
		if( n == 1) {
			return 1;
		}
		return fibonacci2(n-1)+fibonacci2(n-2);
	}

猜你喜欢

转载自blog.csdn.net/toward_south/article/details/89481144
今日推荐