Java的冒泡排序和二分法查找

最近在学Java,三大面向对象语言c++,Java,c#各有各的优点,其实最重要的是面向对象的编程思想,掌握了思想,再学其他语言无非就是语法不同了,编程思想都是类似的。现在贴出一段程序,先用冒泡法对日期进行排序,然后用二分法查找日期。

public class lesson409 {
	public static void main(String args []) {
 
	Date [] day = new Date[8];      //定义一个数组,数组元素是Date对象
	day[0] = new Date(2013,7,31);
	day[1] = new Date(2012,12,12);
	day[2] = new Date(1990,5,5);
	day[3] = new Date(2020,8,8);
	day[4] = new Date(1994,3,20); 
	day[5] = new Date(1994,3,15);
	day[6] = new Date(1994,5,20);
	day[7] = new Date(2012,3,12);
	
	Date d = new Date(1994,3,20);	//排序后需查找的一个日期
	int len = day.length;
	for(int i= 0;i<len;i++) {
		System.out.print(day[i]);
	}
	range(day);                     //排序方法的调用
	System.out.println("\n###########################");
	for(int i= 0;i<len;i++) {
		System.out.print(day[i]);
	}                               //打印排好序后的日期
	
	System.out.println("\nthe index is "+find(day,d));//打印查找得到的所在数组下标
	
	
	}
	public static int find(Date [] date,Date d) {  //二分法查找
		int n = date.length;
		int startp = 0;
		int endp = n-1;
		int m = (startp+endp)/2;
		
		while(startp<=endp) {
			 
			if(d.compare(date[m])==-1) {
				endp=m-1;
				 
			}
			else if(d.compare(date[m])==1) {
				startp=m+1;
				 
			}
			else if(d.compare(date[m])==0)
				return m;		
			m=(startp+endp)/2;			
		}
		return -1;
	}
  public static Date[] range(Date[] date) { //冒泡法排序
  	int n = date.length,flag;
  	do {
	  		flag=0;
		  	for(int i=0;i<n-1;i++) {
			  		if( date[i].compare(date[i+1])==1) {   //如果前一个日期比后一个大,则调换位置,第一轮会将最大的冒出来放到最后
			  		   Date temp = date[i];
			  		   date[i] = date[i+1];
			  		   date[i+1] = temp;   
			  		   flag = 1;	
			  		     	  
			  	  }
		  		
		  	}
    }while(flag!=0);                       //如果没有位置调换说明排序结束了,那就跳出循环。
    return date;
  }

}
class Date {                               //定义了一个类,有3个成员年月日,还有compare方法的实现。
	int year;
	int month;
	int day;
	Date(int year,int month,int day) {
		this.year = year;
		this.month = month;
		this.day = day;
	}
	
	int compare(Date date) {
		/*
		return year>date.year ? 1 : (   //没写成的条件语句
			month>date.month ? 1 : (
				day>date.day ? 1 : 0
			)
		);
		*/
		if(year>date.year)             //这种写法有点啰嗦,可以换成上面这种条件语句。
			return 1;
		else if(year<date.year)	
			return -1;
		else if((month>date.month)&&(year ==date.year))
		  return 1;
		else if((month<date.month)&&(year ==date.year))
			return -1;  
		else if((day>date.day)&&(year==date.year)&&(month==date.month))
			return 1;
		else if((day<date.day)&&(year==date.year)&&(month==date.month))
			return -1;	 
		else  
			return 0;
	}	
		
	public String toString() {            //因为要打印对象,所以可以重新实现toString方法。打印Date对象时会打印这个函数的返回值。
		return "\nY-M-D:"+year+"-"+month+"-"+day;
	}	
				 	
}

运行结果如下,我是菜鸟,请各位多多指教。每天学一章。



猜你喜欢

转载自blog.csdn.net/xieshangjian/article/details/9708009