《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 } }