自己的方法
//已知有一个升序的数组,要求插入一个元素,该数组顺序依然是升序,
//比如{10,12,45,90}添加23后,数组为{10,12,23,45,90}
//思路
//1、先插入一个值放在最后(数组扩容)
//2、进行排序
public class hsp183 {
public static void main(String[] args){
//1、先插入一个值放在最后
//定义一个数组
int arr[] = {10,12,45,90};
//在定义一个长度为arr.length的arr1
int arr1[] = new int[arr.length+1];
for(int i = 0;i<arr.length;i++){//先对前arr.length个元素赋值
arr1[i] = arr[i];
}
//再对第arr1.length个位置赋值
arr1[arr1.length-1] = 23;
//使得arr也指向arr1的地址
arr = arr1;
//输出插入后的arr
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + "\t");
}
System.out.println();
//2、进行排序
//定义一个记录插入的数字应该放在的位置
int index = -1;
//定义一个变量保存插入的数
int temp = arr[arr.length-1];
for(int i = 0;i<arr.length;i++){
if(arr[arr.length-1]<arr[i]){
index = i;
break;
}
}
//这点没有考虑到,若遍历完后没有改变index值说明插入是最大的,直接放在最后
if(index == -1){
index = arr.length-1;
}
//index后的数进行右移
for(int j = arr.length-1;j>index;j--){
arr[j] = arr[j-1];
}
//将插入的值保存在index上
arr[index] = temp;
//输出排序后的arr
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + "\t");
}
System.out.println();
}
}
老师的方法
//已知有一个升序的数组,要求插入一个元素,该数组顺序依然是升序,
//比如{10,12,45,90}添加23后,数组为{10,12,23,45,90}
//
//老师思路 扩容加定位
//1、先确定添加的数应该插入到哪个索引(先定位)
public class hsp183_1 {
public static void main(String[] args){
//1、定位
//定义一个数组
int arr[] = {10,12,45,90};
int insertNum = 23;
int index = -1;//index就是要插入的位置
//遍历arr数组,若发现insertNum<=arr[i],说明i就是要插入的位置
//使用index保留index =i
//若遍历完没有发现insertNum<=arr[i],说明index = arr.length即放在最后
for(int i = 0;i<arr.length;i++){
if(insertNum <= arr[i]){
index = i;
break;
}
}
if(index == -1){//遍历完没有发现insertNum<=arr[i]
index = arr.length;
}
System.out.println("index为" + index);
//2、扩容
int arr1[] = new int[arr.length+1];
//下面将arr的元素拷贝到arr1,并且要跳过index位置
for(int i = 0,j=0;i<arr1.length;i++){//遍历arr1的所有位置进行赋值
if(i != index){//不是index的元素直接拷贝
arr1[i] = arr[j];
//star
j++;//精妙之处就在这个j++,只有当拷贝非index的值时才会+1
}
else{
arr1[i] = insertNum;
}
}
//使得arr也指向arr1
arr = arr1;
//输出
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i] + "\t");
}
}
}