题目如下:

求出插入后的数组

已知有个升序的数组,要求插入一个元素,该数组顺序依然是升序,比如:
[10,12,45,90],添加23 后, 数组为 [10,12,23,45,90]

public class the_h01 {
public static void main(String[] args) {
// 4.已知有个升序的数组,要求插入一个元素,
// 该数组顺序依然是升序,比如:
// [10,12,45,90],添加23 后, 数组为 [10,12,23,45,90]
int[] arr={10,12,45,90};
int num = 23;

// 我以前的思路:
// 先将arr拷贝到新数组
// 再将arr扩容
// 最后将新数组拷贝回去,将值新加到末尾。
// 使用冒泡将其调换至升序的正确位置。
// 当然,有这个想法时,时忽视了题目的
// 原本就是升序,加进去依然是升序
// 也就是说,我的思路本身能处理的东西实际上是:
// 乱序的数组,插入元素后将数组升序。
// 据说冒泡排序似乎有些问题,这个以后再思考
// 先实现这个方法

// 创建一个数组
int[] new_arr = new int[arr.length+1];
// 遍历拷贝
for (int i=0;i<arr.length ;i++ ) {
new_arr[i]=arr[i];
}
// 拷贝完成后,将arr扩容
arr = new int[new_arr.length];
for (int i=0;i<arr.length ;i++ ) {
arr[i]=new_arr[i];
}
new_arr = null;
arr[arr.length-1] = num;

// 冒泡排序
// 整体上呈现的是最大长度-1的情况
for (int i=1;i<arr.length-1 ;i++ ) {
int index = -1;
for (int j=1;j<arr.length-i+1 ;j++ ) {
// System.out.print(arr[j]+" ");
if (arr[j]<arr[j-1]) {
int numx = arr[j];
arr[j] = arr[j-1];
arr[j-1] = numx;
index = i;
}
for (int ix=0;ix<arr.length ;ix++ ) {
System.out.print(arr[ix]+" ");
}
System.out.println("");

}
if (index==-1) {
System.out.println("-------");
break;
}
}


}
}

当我听完老师的解释后,有些被震撼到了。这就是……算法的魅力?

public class the_h01 {
public static void main(String[] args) {
// 4.已知有个升序的数组,要求插入一个元素,
// 该数组顺序依然是升序,比如:
// [10,12,45,90],添加23 后, 数组为 [10,12,23,45,90]
int[] arr={10,12,45,90};
int num = 23;

// 现在的思路:
// 首先,确信一点:数组本身有序
// 第二,新增元素需要有序的添加到列表当中
// 如何有序添加进去?
// 新增一个数组,数组的大小为(arr.length+1)

// 新建数组
int[] new_arr = new int[arr.length+1];
// 存储对应下标
int index = -1;
// 确定新增元素在arr的位置
for (int i=0;i<arr.length ;i++ ) {
if (num<arr[i]) {
index = i;
break;
}
}
if (index==-1){
// 当确定其比较大小没有结果时
// 确定其为新数组下标最大值值,
index=arr.length;
}
// 取得确切下标后,将元素插入数组
for (int i=0,j=0;i<new_arr.length ;i++ ) {
// 当找到指定下标时,使用new_arr[i]将新增的排列的元素加入数组。
if (index!=i) {
new_arr[i]=arr[j];
j++;
} else {
new_arr[i]=num;
}
}
for (int i=0;i<new_arr.length ;i++ ) {
System.out.print(new_arr[i]+" ");
}
}
}

"结果集"