目录
题目:
已知有一个从小到大的数组:int[] arr = {10, 12, 45, 90};
要求:
插入任意int类型的数(当然可以扩展),使其插入之后按从小到大的顺序排序并打印。
提升:
普通的遍历,对大的数组效率低,使用二分查找法提升效率!
效果:
代码:
package com.gao.test.array;
import java.util.Scanner;
/**
* @Author lie
* @Description 数组的定位+排序
*/
public class ArraySort {
public static void main(String[] args) {
//一开始的数组
int[] arr = {10, 12, 45, 90};
//结束标记
String ifContinue = null;
do {
//[10,12,45,90] 添加23后 ,数组为[10,12,23,45,90] 排过序的
System.out.println("插入前的数组为:");
for (int i : arr) {
System.out.print(i + " ");
}
Scanner in = new Scanner(System.in);
System.out.println("请输入要插入数组的整数");
int target = in.nextInt();
//用二分查找法(这个定位速度快,性能高)
int insertIndex = -1;
int left = 0;
int right = arr.length - 1;
//比数组最后的元素大,直接放最后;比数组第一个元素小,直接放第一位
if( arr[right] <= target ){
insertIndex = arr.length;
}else if (arr[left] >= target){
insertIndex = 0 ;
}else{
//左角标 >= 右角标,循环终止,找出需要插入数组的位置
while (left <= right) {
int mid = (right + left) / 2;
if (target < arr[mid]) {
right = mid - 1;
if (target > arr[mid - 1]) {
insertIndex = mid;
break;
}
} else if (target == arr[mid]) {
insertIndex = mid;
break;
} else {
left = mid + 1;
}
}
}
//新建数组
int[] newArr = new int[arr.length + 1];
for (int i = 0, j = 0; i < newArr.length; i++) {
//如果不是角标位置就可以插入原数组的数字,否则插入新的数组
if(i != insertIndex){
newArr[i] = arr[j];
j++;
}else{
newArr[i] = target;
}
}
//把新数组指向旧数组并打印
arr = newArr;
for (int i : arr) {
System.out.print(i + " ");
}
System.out.println("\n是否继续添加?(y/n)");
ifContinue= in.next();
}while ("y".equals(ifContinue));
}
}