1.7.2数组高级操作
1.数组的查找
-
二分查找
-
使用二分查找,数组必须按照一定顺序排序
-
步骤
- 定义两个变量,表示要查找的范围。默认min = 0,max = 最大索引
- 循环查找,但是min ≤ max
- 计算出mid的值(min + max) / 2
- 判断mid位置的元素是否为要查找的元素,如果是直接返回对应索引
- 如果要查找的值在mid的左半边,那么min值不变,max = mid - 1,继续下次循环查找
- 如果要查找的值在mid的右半边,那么max值不变,min = mid + 1,继续下次循环查找
- 当min > max 时,表示要查找的元素在数组中不存在,返回-1(不存在的索引)
public static void main(String[] args){ int [] arr = {1,2,3,4,5,6,7,8,9,10}; int number = 3; int index = binarySearchForIndex(arr,number); System.out.print(index); } public static int binarySearchForIndex(int[] arr,int number){ // 1.定义查找的范围 int min = 0; int max = arr.length - 1; // 2.循环查找 while(min <= max){ // 3.计算出中间位置mid,右移移位,等于除2 int mid = (min + max)>> 1; // mid指向的元素 > number if(arr[mid] > number){ // 表示要查找的元素在左边 max = mid - 1; }else if(arr[mid] < number){ // mid指向的元素 < number,要查找元素在右边 min = mid + 1; }else{ // mid指向的元素 == number return mid; } } // 如果min大于了max就表示元素不存在,返回-1 return -1; }
2.数组的排序
- 排序:将一组数据按照固定的规则进行排列
2.1冒泡排序
- 相邻的数据两两比较,小的放前面,大的放后面
- 如果有n个数据进行排序,总共需要比较n-1次
- 每一次比较完毕,下一次的比较就会少一个数据参与
public static void main(String[] args){
int[] arr = {3,5,2,1,4};
// 外层循环控制次数,比数组长度少一次
for(int i = 0; i < arr.length -1; i++){
// 内层循环是实际循环比较的
// -1 是为了让数组不要越界
// -i 每一轮结束之后,就会少比一个数字
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;
}
}
}
}
3.递归
- 概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象。
- 递归解决问题的思路
- 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算
- 案例1:用递归思想求1-100的和
public static void main(String[] args){
int sum = getSum(100);
System.out.print(sum);
}
public static int getSum(int i){
if(i == 1){
return 1;
}else{
return i + getSum(i - 1);
}
}
- 案例2:用递归求5的阶乘
public static void main(String[] args){
int result = getJc(5);
System.out.println(result);
}
public static int getJc(int i){
if(i == 1){
return 1;
}else{
return i * getJc(i - 1);
}
}
- 递归的两要素
- 递归的出口
- 递归规则
4.快速排序
- 冒泡排序算法中,一次循环结束,就相当于确定了当前的最大值,也能确定最大值在数组中应存入的位置
- 快速排序算法中,每一次递归时以第一个数为基准数,找到数组中所有比基准数小的,在找到所有比基准数大的,小的全部放左边,大的全部放右边,确定基准数的正确位置
public static void main(String[] args){
int[] arr = {6,1,2,7,9,3,4,5,10,8};
quiteSort(arr,0,arr.length - 1);
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i] + "");
}
}
public static void quiteSort(int[] arr,int left,int right){
if(right < left){
return;
}
int left0 = left;
int right0 = right;
// 计算基准数
int baseNumber = arr[left0];
while(left != right){
// 从右往左找
while(arr[right] >= baseNumber && right > left){
// 比baseNumber大,不用动,指针往前移
right--;
}
while(arr[left] <= baseNumber && right > left){
// 比baseNumber小,不用动,指针往后移
left++;
}
// 交换两个找到的数
int temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
}
// 当指针重合时,将基准数归位
int temp = arr[left];
arr[left] = arr[left0];
arr[left0l] = temp;
quiteSort(arr,left0,left-1);
quiteSort(arr,left+1,right0);
}
5.Arrays
- 概述:Arrays类包含用于操作数组的各种方法
5.1Arrays常用的方法
- public static toString(int[] a):返回指定数组的内容的字符串表示形式
public static void main(String[] args){
int [] arr = {3,2,4,6,7};
System.out.println(Arrays.toString(arr));
}
- public static void sort(int[] a):按照数字顺序(升序)排列指定的数组
int [] arr = {3,2,4,6,7};
Arrays.sort(arr);
// 结果[2,3,4,6,7]
- public static int binarySearch(int[] a,int key):利用二分查找返回指定元素的索引
- 所查数组必须有序
- 如果查找元素存在,返回是这个元素实际的索引
- 查找的元素不存在,返回的是(-插入点 - 1);插入点:如果这个元素在数组中,他应该在哪个索引上
int [] arr = {1,2,3,4,5,6,7,8,9,10};
int index = Arrays.binarySearch(arr,0);
System.out.println(index);
// 结果:-1