《java入门第一季》之Arrays类前传(排序问题)

一:冒泡排序
/*
 * 数组排序之冒泡排序:
 * 		相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处
 * 
 * 引申:
 * 利用冒泡排序法,可以获取一个数组的最大值(先冒泡排序,取最后一个值)和最小值(调用冒泡排序,取第一个值)
 */
public class ArrayDemo {
	public static void main(String[] args) {
		// 定义一个数组
		int[] arr = { 24, 69, 80, 57, 13 };
		System.out.println("排序前:");
		printArray(arr);

		//由于可能有多个数组要排序,所以要写成方法
		bubbleSort(arr);
		System.out.println("排序后:");
		printArray(arr);
	}
	
	//冒泡排序代码
	public static void bubbleSort(int[] arr){
		for (int x = 0; x < arr.length - 1; x++) {//外循环控制比较的次数(arr.length-1)轮
			for (int y = 0; y < arr.length - 1 - x; y++) {// arr.length - 1是为了防止数据越界,// arr.length - 1 - x是为了减少比较的次数
				if (arr[y] > arr[y + 1]) {//前面的数大于后边的数。交换
					int temp = arr[y];
					arr[y] = arr[y + 1];
					arr[y + 1] = temp;
				}
			}
		}
	}

	// 遍历功能
	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x == arr.length - 1) {
				System.out.print(arr[x]+"]");
			} else {
				System.out.print(arr[x] + ", ");
			}
		}
	}
}


二:选择排序

/*
 * 数组排序之选择排序:
 * 		从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在了最小索引处
 */
public class ArrayDemo {
	public static void main(String[] args) {
		// 定义一个数组
		int[] arr = { 24, 69, 80, 57, 13 };
		System.out.println("排序前:");
		printArray(arr);
		
		//用方法改进
		selectSort(arr);
		System.out.println("排序后:");
		printArray(arr);

	}

	public static void selectSort(int[] arr){
		for(int x=0; x<arr.length-1; x++){//总共进行arr.length-1轮
			for(int y=x+1; y<arr.length; y++){
				if(arr[y] <arr[x]){//如果后面的数小于前面的数,交换,始终使得前面的为小值
					int temp = arr[x];
					arr[x] = arr[y];
					 arr[y] = temp;
				}
			}
		}
	}

	// 遍历功能
	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x == arr.length - 1) {
				System.out.print(arr[x]);
			} else {
				System.out.print(arr[x] + ", ");
			}
		}
		System.out.println("]");
	}
}

三:二分查找

/*
 * 查找:
 * 		基本查找:数组元素无序(从头找到尾)
 * 		二分查找(折半查找):数组元素有序
 * 
 * 分析:
 * 		A:定义最大索引,最小索引
 * 		B:计算出中间索引
 * 		C:拿中间索引的值和要查找的值进行比较
 * 			相等:就返回当前的中间索引
 * 			不相等:
 * 				大	左边找
 * 				小	右边找
 * 		D:重新计算出中间索引
 * 			大	左边找
 * 				max = mid - 1;
 * 			小	右边找
 * 				min = mid + 1;
 * 		E:回到B
 */
public class ArrayDemo {
	public static void main(String[] args) {
		//定义一个数组
		int[] arr = {11,22,33,44,55,66,77};
		
		//写功能实现
		int index = getIndex(arr, 33);
		System.out.println("index:"+index);
		
		//假如这个元素不存在后有什么现象呢?
		index = getIndex(arr, 333);
		System.out.println("index:"+index);//-1
	}
	
	
	public static int getIndex(int[] arr,int value){
		//定义最大索引,最小索引
		int max = arr.length -1;
		int min = 0;
		
		//计算出中间索引
		int mid = (max +min)/2;
		
		//拿中间索引的值和要查找的值进行比较
		while(arr[mid] != value){//while实现循环
			if(arr[mid]>value){//大	
				max = mid - 1;//左边找
			}else if(arr[mid]<value){//小
				min = mid + 1;//右边找
			}
			
			//加入判断
			if(min > max){//找不到
				return -1;
			}
			
			mid = (max +min)/2;//重新取新一轮数组的中间值
		}
		
		return mid;//arr[mid] = value
	}
}



原文地址:https://www.cnblogs.com/wanghang/p/6299826.html