Java入门程序:选择排序 和 冒泡排序 以及 二分法查找

  • 目的一:使用选择排序算法排序一个无规则整数数组。
  • 代码1(常规选择排序法):
    在这里插入图片描述
  • 常规选择排序简单优化原因图:
    在这里插入图片描述
  • 代码2(优化1):
    在这里插入图片描述
    第二次简单优化:减少每次循环中不必要的初始化。
  • 代码3:
public class TestArrySelectSort {
	public static void main (String[] arg) {
		int[] a = new int[arg.length];
		for(int i=0; i<arg.length; i++) {
			a[i] = Integer.parseInt(arg[i]);
		}
		print(a);
		selectSort(a);
		print(a);
	}
	
	private static void selectSort(int[] a) {
		int k,temp;
		for(int i=0; i<a.length; i++) {
			k = i;
			for(int j=k+1; j<a.length; j++) {
				if (a[j]<a[k]) {
					k = j;
				}
			}
			if(k != i) {
					temp = a[i];
					a[i] = a[k];
					a[k] = temp;
				}
		}
	}
	
	private static void print(int[] a) {
		for(int i=0; i<a.length; i++) {
			System.out.print(a[i] + " ");
		}
		System.out.println();
	}
}


  • 效果图:
    在这里插入图片描述
    注:从Dos命令行输入{2,4,6…}存于String [ ] args中,但其数据类型为String,所以要利用为int的包装类Integer,并调用Integer.parseInt()将String类型转换为int。

  • 目的二:使用选择排序算法排序无序日期型数组。

  • 代码:

public class TestDateSelectSort {
	public static void main (String [] arg) {
		//静态初始化
		Date[] date = {new Date(2006,5,4),new Date(2006,7,4),new Date(2008,5,4),new Date(2004,5,9),new Date(2004,5,4)};
		/*动态初始化
		Date[] date = new Date[5];
		date[0] = new Date(2006,5,4);
		date[1] = new Date(2006,7,4);
		date[2] = new Date(2008,5,4);
		date[3] = new Date(2004,5,9);
		date[4] = new Date(2004,5,4);*/
		
		selectSort(date);
		
		for(int i=0;i<date.length;i++) {
			System.out.println(date[i]);
		}
	}
	/*普通选择排序法
	public static void selectSort (Date[] date) {
		Date temp;
		for (int i=0;i<date.length;i++) {
			for (int j=i+1;j<date.length;j++) {
				if(date[i].compare(date[j])>0) {
					temp = date[i];
					date[i] = date[j];
					date[j] = temp;
				}
			}
		}
	}*/
	//优化后选择排序
	public static void selectSort (Date[] date) {
		Date temp;
		int k;
		for (int i=0;i<date.length;i++) {
			k = i;
			for (int j=k+1;j<date.length;j++) {
				if(date[k].compare(date[j])>0) {
					k = j;
				}
			}
			if (k != i) {
				temp = date[i];
				date[i] = date[k];
				date[k] = temp;
			}
		}
	}
}

class Date {
		int year,month,day;
		
		Date (int year,int month,int day) {
			this.year = year;
			this.month = month;
			this.day = day;
		}
		
		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 () {
			return "Year-Month-Day:" + year + "-" + month + "-" + day;
		}
	}
  • 效果图:
    在这里插入图片描述
  • 目的3:使用冒泡排序算法排序无规则整数数组。
  • 代码:
public class TestArryBubbleSort {
	public static void main (String [] args) {
		int[] a = new int[args.length];
		
		for (int i=0;i<args.length;i++) {
			a[i] = Integer.parseInt(args[i]);
		}
		
		print(a);
		bubble(a);
		print(a);
	}
	
	public static void bubble (int[] a) {
		int temp;
		int len = a.length;
		for (int i=len-1;i>=1;i--) {
			for (int j=0;j<=i-1;j++) {
				if (a[j]>a[j+1]) {
					temp = a[j+1];
					a[j+1] = a[j];
					a[j] = temp;
				}
			}
		}
	}
	
	public static void print (int[] a) {
		for (int i=0;i<a.length;i++) {
			System.out.print(a[i] + " ");
		}
		System.out.println();
	}
}
  • 效果图:
    在这里插入图片描述
  • 目的4 :使用冒泡排序算法排序无规则日期型数组。
  • 代码:
public class TestDateBubbleSort {
	public static void main (String [] args) {
		
		/*TestDateBubbleSort.Date[] date = new TestDateBubbleSort.Date[5];
		 date[0] = new TestDateBubbleSort().new Date(2006,5,4);
		 date[1] = new TestDateBubbleSort().new Date(2006,7,4);
		 date[2] = new TestDateBubbleSort().new Date(2008,5,4);
		 date[3] = new TestDateBubbleSort().new Date(2004,5,9);
		 date[4] = new TestDateBubbleSort().new Date(2004,5,4);*/
		 
		Date[] date = new Date[5];
		date[0] = new Date(2006,5,4);
		date[1] = new Date(2006,7,4);
		date[2] = new Date(2008,5,4);
		date[3] = new Date(2004,5,9);
		date[4] = new Date(2004,5,4);
		
		bubbleSort(date);
		
		for(int i=0;i<date.length;i++) {
			System.out.println(date[i]);
		}
	}
	
	public static void bubbleSort(Date[] date) {
		int len = date.length;
		for (int i=len-1; i>=1; i--) {
			for (int j=0; j<=i-1; j++) {
				if (date[j].compare(date[j+1]) > 0) {
					Date temp = date[j];
					date[j] = date[j+1];
					date[j+1] = temp;
				}
			}
		}
	}
 	
}

class Date {
		int year,month,day;
		
		Date (int year,int month,int day) {
			this.year = year;
			this.month = month;
			this.day = day;
		}
		
		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 () {
			return "Year-Month-Day:" + year + "-" + month + "-" + day;
		}
	}
  • 效果图:
    在这里插入图片描述

排序中出现的常见错误:参考链接
冒泡排序优化可以参考:
参考1
参考2

  • 目的5:查找数据,下述程序包含普通查找和二分法查找两种方式。其中二分法查找效率最高,但使用前提是数组已经进行了某种排序即数组必须有序。
  • 代码:
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("General search is" + " " + search(a,i));
		System.out.print("Binary search is" + " " + binarySearch(a,i));
	}
	
	public static int search(int[] a, int num) {
		for(int i=0;i<a.length;i++) {
			if(a[i]==num) {
				return i;
			}
		}
		return -1;
	}
	
	public static int binarySearch (int[] a,int num) {
		
		int startPro = 0;
		int endPro = a.length-1;
		int m = (startPro + endPro)/2;
		
		while(startPro <= endPro) {
			if(a[m] == num) return m;
			if(a[m] < num) {
				startPro = m+1;
			}
			if(a[m] > num) {
				endPro = m-1;
			}
			m = (startPro + endPro)/2;
		}
		return -1;
	}
}
  • 效果图:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值