查找

哈哈,在程序里面,查找也是很重要的。下面给出简单的几种查找...

package net.itaem.search;

import java.util.Arrays;
import java.util.Random;

/**
 * 顺序查找
 * */
public class Search {

	private int[] search = new int[Integer.MAX_VALUE/32];
	private Random random = new Random();


	public Search(){
		for(int i=0; i<Integer.MAX_VALUE/32; i++){
			search[i] = i;
		}

	}

	//顺序查找
	//逐个遍历
	public int iterSearch(int key){
		for(int i=0; i<search.length; i++){
			if(search[i] == key){
				return i;
			}
		}



		//代表没有找到
		return -1;
	}

	//折半查找
	//前提条件:这个带查找集合是已经排序好的集合
	public int binarySearch(int key){

		//第一步:先排序带查找的数组,测试时,因为数据本身已经排序好了,不需要执行
		//Arrays.sort(search);
		int low = 0;  //低位
		int high = search.length - 1;   //高位

		int middle = -1;
		while(low < high){
			middle = (low + high)/2;
			int var = search[(low + high)/2];
			if(key > var){
				low = middle + 1;  //往大的方向移动一位
			}else if(key < var){
				high = middle;    //往小的方向移动一位
			}else{
				return middle;   //找到了直接返回
			}
		}

		return middle;
	}

	//插值查找
	//注意:是插值查找,不是插入排序
	public int interpolationSerach(int key){
		//前提条件:该集合数组排序好
		//第一步:先排序带查找的数组,测试时,因为数据本身已经排序好了,不需要执行
		//Arrays.sort(search);
		int low = 0;  //低位
		int high = search.length - 1;   //高位

		int middle = -1;
		while(low < high){
			middle = low + (high-low) * (search[high] - search[low]);   //优化middle...
			middle = (low + high)/2;
			int var = search[(low + high)/2];
			if(key > var){
				low = middle + 1;  //往大的方向移动一位
			}else if(key < var){
				high = middle;    //往小的方向移动一位
			}else{

				return middle;   //找到了直接返回
			}
		}

		return middle;
	} 
	
	public int fibonacciSearch(int key){
		return -1;
	}

	public static void main(String[] args) {
		Search search = new Search();

		System.out.println("=====================iterator search================");
		System.out.println(99999 + " in " + search.iterSearch(99999));

		System.out.println("=================binary serach=========================");
		System.out.println(99999 + " binary serach " + search.binarySearch(99999));

		System.out.println("=================interpolation serach=========================");
		System.out.println(99999 + " interpolation serach " + search.interpolationSerach(99999));

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值