题目:
在有序的数组 int[] arr = {10, 12, 45, 90} 中 插入一个值,使插入的数组仍然是有序的。
主题思想:掌握下标的使用,控制两个数组的下标,实现效果
方法一(优):
先取得比较数值应插入的下标,然后在进行循环插入
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = {10, 12, 45, 90};
int[] arrNew = new int[arr.length + 1];
System.out.println("请输入插入的数字:");
int num = sc.nextInt();
int index = arr.length;// 定义一个index来获取下标,初始值为旧数组长度
for (int i = 0; i < arr.length; i++) {
// 判断输入的数值应该储存的位置,小于谁就储存在谁的位置
if (num < arr[i]){
index = i;
break;
}
}
// 循环赋值
for (int i = 0, j = 0; i < arrNew.length; i++) {
//当不等于index就正常赋值,旧数组下标正常移动
if (i != index){
arrNew[i] = arr[j];
j++;
}else{// 等于index 时,旧数组下标不移动,新数组添加值
arrNew[i] = num;
}
}
arr = arrNew;
System.out.println(Arrays.toString(arr));
}
方法二:
使用循环比较赋值的方法,有三种情况:
1、当输入的数值小于第一个数时,就插入在下标为0的位置;
2、用输入的数值去进行比较,当大于当前下标数且小于后一个数,就在下一个下标进行赋值
3、当大于最后一个值就在最后添加
public static void main(String[] args) {
int[] arr = {10, 12, 45, 90};
Scanner sc = new Scanner(System.in);
System.out.println("请输入插入的数字:");
int num = sc.nextInt();
// 设置新数组的长度+1
int[] arrNew = new int[arr.length + 1];
// j的作用是控制旧数组输出的值
for (int i = 0, j = 0; i < arrNew.length; i++,j++) {
arrNew[i] = arr[j];
if (i == 0 && arr[j] > num) {// 当输入的值小于第一个数时,将改数赋值给新数组第一个值
arrNew[0] = num;
// 由于新数组的值被覆盖,将旧数组的下标重新退回0重新赋值
j--;
} else if (i == arr.length - 1 && arr[j] < num) {// 当循环运行到最后时判断输入的数字是否大于最后一个数,i == arr.lenght是判断前面是否循环完毕
// 如果大于,就在新数组的最后添加
arrNew[i + 1] = num;
// 退出循环
break;
} else if (arr[j] < num && arr[j + 1] > num) {// 判断输入的数字是否大于当前数字小于后一个数字
// 如果在就将num插入到后一位
arrNew[i + 1] = num;
// 控制新数组的下标,提前一位,避免和新插入的数字冲突
i++;
}
}
arr = arrNew;
System.out.println(Arrays.toString(arr));
}