折半算法理解,就是通过一个有序的数据 通过最大索引和最下索引更新的方式 ,找到想要找到的数据,可以加快寻找
递归方式:
/**
* 递归法折半
*
* @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;
}
}
}
}
文章持续更新