数组-二分查找

二分查找效率较高


排序之后


从中间开始查找,比较中间值和要比较的数的大小
如果中间值大于要比较的数,要比较的数在左半边找(endPos=m-1)
如果中间值小于要比较的数,要比较的数在右半边找(startPos=m+1)
当左右区间小于等于时结束循环


一、对普通的数据排序

public class TestSearch {
	public static void main(String[] args) {
		int a[] = { 1, 3, 6, 8, 9, 10, 12, 18, 20, 34 };
		int i = 12;

		System.out.println(binarySearch(a, i));
	}
	

	
	public static int binarySearch(int[]a, int num) {
    if (a.length==0) return -1;
    
    int startPos = 0; 
    int endPos = a.length-1;
    int m = (startPos + endPos) / 2;
    while(startPos <= endPos){
      if(num == a[m]) return m;
      if(num > a[m]) {
      	startPos = m + 1;
      }
      if(num < a[m]) {
      	endPos = m -1;
      }
      m = (startPos + endPos) / 2;
    }
    return -1;
  }

}


二、对引用类型的进行排序
public class DateSort {
public static void main(String[] args){
	Date[] days = new Date[5];
	days[0] = new Date(2016, 5, 4);
	days[1] = new Date(2016, 7, 4);
	days[2] = new Date(2018, 5, 4);
	days[3] = new Date(2010, 5, 9);
	days[4] = new Date(2010, 5, 4);
	Date d = new Date(2016, 7, 4);
	
	bubbleSort(days);								//调用排序的方法
	
	for(int i=0; i<days.length; i++){				//打印排序后的顺序
		System.out.println(days[i]);
	}
	
	System.out.println(binarySearch(days, d));
}
public static void bubbleSort(Date[] a){
	int len = a.length;
	for(int i = len-1; i >= 1; i--){				//冒泡法排序
		for(int j = 0; j<= i-1; j++){
			if( a[j].compare(a[j+1]) >0) {
				Date temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
	}
}

public static int binarySearch(Date[] days, Date d){
	if(days.length == 0) return -1;
	int startPos = 0;
	int endPos = days.length-1;
	int mid = (startPos + endPos)/2;
	while(startPos <= endPos){
		if(d.compare(days[mid]) == 0 ) return mid;
		if(d.compare(days[mid]) > 0){
			startPos = mid+1;
		}
		if(d.compare(days[mid]) < 0){
			endPos = mid -1;
		}
		mid = (startPos + endPos)/2;
	}
	return -1;
}

}

class Date{
	int year, month, day;	
	
	Date(int x, int y, int z){
		year = x; month = y; day = z;
	}
	
	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;
				
	}
	
	public String toString(){						//重写toString方法,否则返回的是days[]的哈希码
		return "Year:Month:Day--"+ year + "-" + month + "-" + day;
	}
}


二者的差别就是在比较元素的时候,对于引用类型的比较需要调用一个方法来比较元素的大小


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值