用二分法对引用类型进行查找

          首先,我们都清楚,如果想在一堆数据中进行查找的话,这些数据最好都是排好序的,这样才方便查找。

           也就是说查找,一般是建立在排序的基础上,下面我们就拿上篇博文中的例子:

          http://blog.csdn.net/yjjm1990/article/details/7993378

          对Date这个引用类型进行查找

public class TestSearchDate
{
	public static void main(String args[])
	{
		Date[] d=new Date[5];
		d[0]=new Date(2006,5,4);
		d[1]=new Date(2006,7,4);
		d[2]=new Date(2008,5,4);
		d[3]=new Date(2004,5,9);
		d[4]=new Date(2004,5,4);
		
		bubbleSort(d);
		
		for(int i=0;i<=d.length-1;i++)
		{
			System.out.println(d[i]);
		}
		
		Date oneDate=new Date(2008,5,4);	//查找这个日期中排序序列的什么位置
		System.out.println(Search(oneDate,d));
	}
	
	//用冒泡排序法,进行排序
	public static void bubbleSort(Date[] d)
	{
		for(int i=d.length-1;i>=1;i--)
		{
			for(int j=0;j<i;j++)
			{
				if(d[j].Compare(d[j+1])>0)
				{
					Date temp;
					temp=d[j];d[j]=d[j+1];d[j+1]=temp;
				}
			}
		}
	}
	
	//用二分法查找oneDate在d这个Date数组的什么位置
	public static int Search(Date oneDate,Date[] d)
	{
		Date temp;
		int current;
		int startPos=0;
		int endPos=d.length-1;
		
		current=d.length/2;
		
		while(startPos<=endPos)
		{
			if(oneDate.Compare(d[current])==0)
			{
				return current;	//找到了,返回当前的索引
			}
			else if(oneDate.Compare(d[current])>0)
			{
				startPos=current+1;
			}
			else
			{
				endPos=current-1;
			}
			current=(startPos+endPos)/2;
		}
		return -1;	//表示没有找到
	}
}

class Date
{
	int year,month,day;
	Date(int y,int m,int d)
	{
		year=y;month=m;day=d;
	}
	
	//定义一个比较的方法
	public int Compare(Date date)
	{
		return year>date.year?1
				:year<date.year?-1
				:month>date.month?1
				:month<date.month?-1
				:day>date.day?1
				:day<date.day?-1:0;
	}
	//重写toString方法
	public String toString()
	{
		return "year-month-day:"+year+"-"+month+"-"+day;
	}
}


             主要看就是其中的二分法查找,我想大家一看就明白。

        运行结果如下:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值