自己创建一个升序的数组,要求插入一个元素,该数组仍是升序。
思路:
1、此题需要自己从键盘输入一个数组
2、先输入数组的长度,再定义该长度的数组,最后输入
3、输入后用之前学的冒泡排序给数组排序
4、排序后用do{}while(true);结构来互动是否需要继续添加元素
5、添加元素则用到数组的扩容
6、扩容的思路:
= = 6.1申请新数组,并且容量是之前数组的容量+1
= = 6.2把之前的数组数据赋值给新数组
= = 6.3把需要添加的数据放在数组的结尾
= = 6.4把新数组的地址指向原来的数组(arr = arrNew)注意顺序不要搞反
7、扩容后可以重新排列,也可以与数组中的元素比较,然后交换位置(此处两种方法都有,各有利弊)重新排列算法复杂度较高,交换位置则需要考虑三种情况:插入的数最小、一般、最大…
8、输出
代码如下
import java.util.Scanner;
public class ArrayH01{
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入数组的长度");
int len = myScanner.nextInt();//接收数组长度
int[] arr = new int[len];
int temp ;
System.out.println("请给数组输入值");//接受键盘输入的值
for( int i = 0 ; i < len ; i++){
arr[i] = myScanner.nextInt();
}
for (int i = 0 ; i < len-1 ;i++ ) {//用冒泡排序
for (int j = 0 ; j < len - 1 - i ;j++ ) {
if(arr[j] >= arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.print("数组排序后的值为:");
for(int i = 0 ; i < len ; i++){
//输出排序好的数组序列
System.out.print(arr[i]+" ");
}
do{
System.out.print("是否需要插入元素?");
String ans = myScanner.next();
if( "是".equals(ans) ){ //判断键盘输入的值,如果输入"是",则插入
//否则跳出循环
int[] arrNew = new int[arr.length+1];
System.out.println("请输入要插入的元素值:");
//有两种方法
//一、此方法为插入比较 :
int flagNew = -1;
int numNew = myScanner.nextInt();
for( int i = 0 ; i < arr.length ; i++){
if((i == 0) && numNew <= arr[0]){//判断是否为最小元素,若是则插最前面
flagNew = 0;
}
else if( (i == arr.length - 1) && numNew >= arr[arr.length-1] ){
flagNew = arr.length;//判断是否为最大元素,若是则插 最后面
}
else if(numNew >= arr[i] && numNew <= arr[i+1] ){
flagNew = i+1;//一般的在中间的情况
}//判断添加的数在哪个位置
}
//找到位置后赋值
arrNew[flagNew] = numNew;
//再把 前面 那部分的值复制过来
for( int j = 0 ; j < flagNew ; j ++){
arrNew[j] = arr[j];
}
//再把 后面 那部分的值复制过来
for( int k = flagNew + 1 ; k < arrNew.length ;k++ ){
arrNew[k] = arr[k-1];
}
arr = arrNew;
//实现扩容
//二、此方法为重新排序:
// for(int k = 0 ;k < arr.length ;k++){
// arrNew[k] = arr[k];//给新数组赋值
// }
// arrNew[len] = myScanner.nextInt();//新加的值放在最后
// arr = arrNew;//把扩容后的新数组 指向原来数组的地址,
// //这样原来的数组也就实现了扩容,注意顺序不要搞反
// for (int i = 0 ; i < arr.length-1 ;i++ ) {
// //重新用冒泡排序
// for (int j = 0 ; j < arr.length - 1 - i ;j++ ) {
// if(arr[j] >= arr[j+1]){
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
// }
// }
// }
System.out.println("数组最新元素为:");
for( int i = 0 ; i < arr.length ;i++){
System.out.println(arr[i]);
}
}else
{
System.out.println("退出添加");
break;
}
}while(true);
}
}