论坛首页 入门技术论坛

基于有序数组二分法查找与线性查找性能区别

浏览 1898 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (11) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-13   最后修改:2009-03-21
package util;

import java.util.Calendar;

/**
 * 二分法查找与线性查找效率问题
 * @author zhanglu
 *
 */
public class DichotomyAndLinearity {
	private int[] array;
	
	public DichotomyAndLinearity(int size){
		array = new int[size];
	}
	public void setArayValue(int index,int value){
		array[index] = value;
	}
	public static void findlinearity(int[] array,int searchKey){
		//arrayOrder(array);
		int i = 0;
		for( i= 0;i < array.length;i++){
			if(array[i] == searchKey){
				break;
			}
		}
		if(i == array.length){
			System.out.println("不存在此项:"+searchKey);
		}else{
			System.out.println("查找到的此项为:"+searchKey);
		}
	}
	/**
	 * 二分法查找数组
	 * @param array
	 * @param searchKey
	 * @return
	 */
	public static String findDigit(int[] array,int searchKey){
		//对数组先进行排序
		//arrayOrder(array);
		int startDigit = 0;//开始下标为0
		int endDigit = array.length - 1;//结束下标
		int currentDigit;
		boolean flag = true;
		while(flag){
			currentDigit = (startDigit+endDigit)/2;
			if(array[currentDigit] == searchKey){
				return currentDigit+":"+searchKey;
			}else if(array[currentDigit] > searchKey){
				endDigit = currentDigit - 1;
			}else{
				startDigit = currentDigit + 1;
			}
			if(startDigit > endDigit){
				flag = false;
				return "没有找到该数据:"+searchKey;
			}
		}
		return null;
	}
	public static void arrayOrder(int[] array){
		for(int i = 0;i < array.length;i++){
			for(int j = array.length - 1;j > 0;){
				int temp;
				if(array[j] < array[j-1]){
					temp = array[j-1];
					array[j-1] = array[j];
					array[j] = temp;
				}
				j--;
			}
		}
	}
	public static void main(String[] args) {
		DichotomyAndLinearity ac = new DichotomyAndLinearity(1000000);
		for(int i = 0;i < 1000000;i++){
			ac.setArayValue(i, i);
		}
		int searchKey = 9999900;
		Calendar c1 = Calendar.getInstance();
		long start01 = c1.getTime().getTime();
		System.out.println(findDigit(ac.array,searchKey));
		Calendar c2 = Calendar.getInstance();
		long start02 = c2.getTime().getTime();
		System.out.println("二分法查找速度:"+(start02-start01));
		
		Calendar c3 = Calendar.getInstance();
		long start03 = c3.getTime().getTime();
		findlinearity(ac.array,searchKey);
		Calendar c4 = Calendar.getInstance();
		long start04 = c4.getTime().getTime();
		System.out.println("线性查找速度:"+(start04-start03));
	}
	
}


二分法性在效率上要强于线性查找
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics