Java 数组的高级操作
1 二分查找
- 查找指定元素在数组中的位置时,若是通过遍历,逐个获取每个元素,看是否是要查找的元素,这种方式当数组元素较多时,查找的效率很低
- 二分查找也叫折半查找,每次可以去掉一半的查找范围,从而提高查找的效率
- 前提条件,数组内的元素一定要按照大小顺序排列,如果没有大小顺序,不能使用二分查找法;
package com.fcarey.sort;
import java.lang.reflect.Array;
import java.util.Arrays;
public class BinarySearch {
public static void main(String[] args) {
int n = 1000;
int[] arr = new int[n];
Arrays.setAll(arr, i -> i + 1);
int target = 888;
System.out.println(binarySearch(arr, target));
}
public static int binarySearch(int[] arr, int target) {
// 定义查找范围
int min = 0;
int max = arr.length - 1;
// 当min <= max时,循环查找
while (min <= max) {
// 确认中间位置,向右移1位相当于赋值减半。
int mid = (min + max) >> 1;
if (arr[mid] < target) {
// arr[mid]指向的值小于目标值时,要查找右边;
min = mid + 1;
} else if (arr[mid] > target) {
// arr[mid]指向的值大于目标时,要查找左边;
max = mid - 1;
} else {
// arr[mid]指向的值等于目标时,要查找左边;
return mid;
}
}
// 如果min 大于max表示所查找的元素不存在。返回-1
return -1;
}
}
2 冒泡排序
- 一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序
- 如果有n个数据进行排序,总共需要比较n-1次
- 每一次比较完毕,下一次的比较就会少一个数据参与
package com.fcarey.sort;
import java.util.stream.IntStream;
public class TestDemo {
public static void main(String[] args) {
int[] arr = {3, 5, 2, 1, 4};
bubbleSort(arr);
}
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
// 外层循环控制的是次数,比数组的长度少1;
for (int j = 0; j < arr.length - i - 1; j++) {
// 内层循环,每层排序一位最大数
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
printArr(arr);
}
private static void printArr(int[] arr) {
IntStream.range(0, arr.length).forEach(i -> System.out.print(arr[i] + " "));
}
}
3 Arrays
方法名 |
说明 |
static int binarySearch(char[] a, int fromIndex, int toIndex, char key) |
使用二分搜索算法搜索指定值的指定数组的范围。 |
static String toString(int[] a) |
返回指定数组的内容的字符串表示形式。 |
static void sort(int[] a) |
按照数字顺序排列指定的数组。 |
static void sort(int[] a, int fromIndex, int toIndex) |
按升序排列数组的指定范围。 |
package com.fcarey.arrays;
import java.util.Arrays;
public class ArraysDemo {
public static void main(String[] args) {
int [] arr = {3, 2,1,5,4};
System.out.println(Arrays.toString(arr));
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
int index = Arrays.binarySearch(arr, 3);
System.out.println(index);
// 1. 数组必须有序
// 2. 若查找的元素存在,返回该元素的索引,否则返回的是"-"加上所查找的元素应该在数组的插入点减1
}
}