1. 找出一个数组中的最大值
public class Test { public static void main(String[] args) { int[] array = {1,2,3,4,5}; System.out.println(maxNum(array)); } public static int maxNum(int[] array){ if(array == null) return -1; if(array.length == 0) return -1; int max = array[0]; for (int i = 1; i < array.length; i++) { if(max < array[i]){ max = array[i]; } } return max; } }
输出结果:
2. 找到数组中指定的元素,使用二分法查找,条件:有序数组
public class Test { public static void main(String[] args) { int[] arr = {1,2,3,4,5,6,7,8,9}; int key = 8; System.out.println( find(arr, key) ); } public static int find(int[] arr, int key){ int left = 0; int right = arr.length - 1; while(left <= right){ int mid = (left + right) / 2; if(arr[mid] < key){ left = mid + 1; } else if (arr[mid] > key) { right = mid - 1; }else { return mid;//返回的是数组的下标 } } return -1; } }
输出结果:
分析:
3. 检查数组的有序性
//检查是否升序 public class Test { public static void main(String[] args) { int[] arr = {1,3,5,7,2}; System.out.println( isup(arr) ); } public static boolean isup(int[] arr){ for (int i = 0; i < arr.length - 1; i++) { if(arr[i] > arr[i + 1]){ return false; } } return true; } }
输出结果:
4. 冒泡排序
public class Test { public static void main(String[] args) { int[] arr = {5,2,1,3,4 }; for (int i = 0; i < arr.length - 1; i++) { int flag = 0; for (int j = 0; j < arr.length - 1 - i; j++) { if(arr[j] > arr[j + 1]){ int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flag = 1; } } if(flag == 0){ break; } } System.out.println(Arrays.toString(arr)); } }
分析:
通过变量 i 和 j 来控制范围。其中 i 表示拿到数组中的每个元素,j 表示每个元素与其他元素比较的趟数。flag == 0,说明已经满足升序,可以跳出循环了,没必要继续遍历下去。感兴趣的读者可以加个计数器测试一下,感受一下有无 flag 的差异。
5. 数组逆序
import java.util.Arrays; public class Test { public static void main(String[] args) { int[] arr = { 1,2,5,8,9,0,4,3 }; int[] arr2 = { 1,2,5,8,10,9,0,4,3 }; reverse(arr); System.out.println(Arrays.toString(arr)); reverse(arr2); System.out.println(Arrays.toString(arr2)); } public static void reverse(int[] arr){ int left = 0; int right = arr.length - 1; while(left <= right){ int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } } }
输出结果:
分析:
6. 调整数组,使得奇数位于偶数之前,不考虑顺序
方法一:
public class Test { public static void main(String[] args) { int[] arr = {1,0,2,3,4,8,5,6,9,7}; swap(arr); System.out.println(Arrays.toString(arr)); } public static void swap(int[] arr){ int left = 0; int right = arr.length - 1; while(left <= right){ //如果数组左边是偶数,数组右边是奇数,那么就交换 if(arr[left] % 2 == 0 && arr[right] % 2 != 0) { int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; } //如果找到的是奇数,就往后跳 if(arr[left] % 2 != 0){ left++; } //如果找到的是偶数,就往前跳 if(arr[right] % 2 == 0){ right--; } } } }
输出结果:
方法二:
public class Test { public static void main(String[] args) { int[] arr = {1, 0, 2, 3, 4, 8, 5, 6, 9, 7}; adjust(arr); System.out.println(Arrays.toString(arr)); } public static void adjust(int[] arr) { int left = 0; int right = arr.length - 1; while (left < right) { while (arr[left] % 2 != 0 && left < right) { left++; } while (arr[right] % 2 == 0 && left < right) { right--; } int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; } } }
输出结果:
分析:
7. 调整数组,使得奇数位于偶数之前,并分别让奇数和偶数变成升序
方法一:
直接对原数组进行操作,不开辟新的空间。
public class Test { public static void main(String[] args) { int[] arr = {1,0,2,3,4,8,5,6,9,7}; adjust(arr); System.out.println(Arrays.toString(arr)); System.out.println("------------------------------"); sort(arr); System.out.println(Arrays.toString(arr)); } //1. 调整数组使得奇数位于偶数之前 public static void adjust(int[] arr){ int left = 0; int right = arr.length - 1; while(left<right){ while(arr[left] % 2 != 0 && left<right){ left++; } while(arr[right] % 2 == 0 && left<right){ right--; } int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; } } public static void sort(int[] arr){ int sign = 0; for (int i = 0; i < arr.length; i++) { //找到偶数位,并记录下来 if(arr[i] % 2 == 0){ sign = i; break; } } //2. 对于数组前一段的奇数进行升序 for (int i = 0; i < sign - 1; i++) { for (int j = 0; j < sign - 1 - i; j++) { if(arr[j]>arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } //3. 对于数组后一段的偶数进行升序 //这里应该注意j的范围,因为j的终止范围并不好计算,所以直接置成 arr.length - 1 for (int i = sign; i < arr.length - 1; i++) { for (int j = sign; j < arr.length - 1; j++) { if(arr[j]>arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } }
输出结果:
方法二:
① 拆分数组
② 排序数组
③ 合并数组
import java.util.Arrays; public class Test { public static void main(String[] args) { int[] arr = { 1,0,2,3,4,8,5,6,9,7 }; adjust(arr); System.out.println(Arrays.toString(arr)); System.out.println("-------------------------------"); int[] newArr = sort(arr); System.out.println(Arrays.toString(newArr)); } //1. 调整数组使得奇数位于偶数之前 public static void adjust(int[] arr){ int left = 0; int right = arr.length - 1; while(left<right){ while(arr[left] % 2 != 0 && left<right){ left++; } while(arr[right] % 2 == 0 && left<right){ right--; } int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; } } //2. 进行排序,返回一个新数组 public static int[] sort(int[] arr){ int sign = 0; for (int i = 0; i < arr.length; i++) { //找到偶数位,并记录下来 if(arr[i] % 2 == 0){ sign = i; break; } } //2.1 将数组 arr 分为两段,分别放至 newArr1 和 newArr2 中 int[] newArr1 = new int[sign]; int[] newArr2 = new int[arr.length-sign]; System.arraycopy(arr,0,newArr1,0,newArr1.length); System.arraycopy(arr,sign,newArr2,0,newArr2.length); //2.2 进行排序 Arrays.sort(newArr1); Arrays.sort(newArr2); //2.3 将 newArr1 和 newArr2 拷贝至 newArr 中 int[] newArr = new int[arr.length]; System.arraycopy(newArr1,0,newArr,0,newArr1.length); System.arraycopy(newArr2,0,newArr,sign,newArr2.length); return newArr; } }
输出结果:
Over. 谢谢观看哟~