java 实现 折半算法 递归和非递归的方式

138 阅读2分钟

折半算法理解,就是通过一个有序的数据 通过最大索引和最下索引更新的方式 ,找到想要找到的数据,可以加快寻找

 

递归方式:

/**
	 * 递归法折半
	 * 
	 * @param arr 匹配数组数据
	 * @param num 匹配数据
	 * @param mini 最小索引值
	 * @param maxi 最大索引值
	 * @return
	 */
	public int isd(int[] arr, int num, int mini, int maxi) {
		int index = (mini+maxi)/2;
		if(arr[index] == num) {
			return index;
		}else if(arr[index] > num) {
			return isd(arr, 125, 0, index-1);
		}else {
			return isd(arr, 125, index+1, arr.length-1);
		}
	}

 

非递归方式:

/**
	 * 非递归法折半
	 * 
	 * @param arr 匹配数组数据
	 * @param num 匹配数据
	 * @param mini 最小索引值
	 * @param maxi 最大索引值
	 * @return
	 */
	public int notd(int[] arr, int num, int mini, int maxi) {
		while(true) {
			int index = (mini+maxi)/2;//获取中间值
			if(arr[index] == num) {
				return index;
			}else if(arr[index] > num) {//匹配值小于索引位置值,说明匹配值在列队左边
				maxi = index - 1; //更新最大索引为当前索引减一位置
			}else {//说明key在列队右边 更新最小索引
				mini = index + 1; //更新最小索引为当前索引加一位置
			}
		}
		
	}

 

实例:

package com.test;

/**
 * 递归和非递归实现折半算法
 * 
 * @author yushen
 *
 */
public class Test {

	public static void main(String[] args) {
		//一个有序数组数据(如果数据不规范可以冒泡一下)
		int[] arr = {2,3,5,6,8,11,24,58,69,87,99,125,154};
		
		Test t = new Test();
		int a = t.isd(arr, 125, 0, arr.length-1);
		System.out.println(a);
		int b = t.notd(arr, 8, 0, arr.length-1);
		System.out.println(b);
	}
	
	/**
	 * 递归法折半
	 * 
	 * @param arr 匹配数组数据
	 * @param num 匹配数据
	 * @param mini 最小索引值
	 * @param maxi 最大索引值
	 * @return
	 */
	public int isd(int[] arr, int num, int mini, int maxi) {
		int index = (mini+maxi)/2;
		if(arr[index] == num) {
			return index;
		}else if(arr[index] > num) {
			return isd(arr, 125, 0, index-1);
		}else {
			return isd(arr, 125, index+1, arr.length-1);
		}
	}
	
	/**
	 * 非递归法折半
	 * 
	 * @param arr 匹配数组数据
	 * @param num 匹配数据
	 * @param mini 最小索引值
	 * @param maxi 最大索引值
	 * @return
	 */
	public int notd(int[] arr, int num, int mini, int maxi) {
		while(true) {
			int index = (mini+maxi)/2;
			if(arr[index] == num) {
				return index;
			}else if(arr[index] > num) {//说明key在列队左边
				maxi = index - 1; 
			}else {//说明key在列队右边 更新最小索引
				mini = index + 1; 
			}
		}
		
	}
	
}

 

文章持续更新