Java语言怎么不断将新输入的数据,插入到现有数组中并且保持现有数组从小到大排列的有序性呢?数组的有序操作可以不借助排序就实现么
使用插入排序算法
效果如图
代码
import java.util.Arrays;
public class InsertionSort {
public static void main(String[] args) {
int[] arr = {3, 8, 12, 5, 2}; // 初始有序数组
int newValue = 7; // 新输入的数据
// 扩展数组
arr = Arrays.copyOf(arr, arr.length + 1);
// 插入新元素到正确的位置
int i;
for (i = arr.length - 2; i >= 0 && arr[i] > newValue; i--) {
arr[i + 1] = arr[i];
}
arr[i + 1] = newValue;
// 打印有序数组
System.out.println(Arrays.toString(arr));
}
}
每插入一个数,找到前一个比他小,后一个比他大的位置插入进去即可
不知道你这个问题是否已经解决, 如果还没有解决的话:问题优化: Java语言中如何将新输入的数据插入现有数组并保持有序性?
问题描述:
我想在Java语言中不断将新输入的数据插入到现有数组中,并且要求保持数组的有序性(从小到大排序)。请问如何实现这个需求?是否有一种方法可以实现有序插入而不需要进行排序操作?
问题标签: Java语言, 数据结构, 数组, 有序插入
为了实现有序插入而不需要进行排序操作,我建议使用二分查找算法来找到插入位置。
下面是实现这个需求的步骤:
创建一个函数insertAndSort
,其参数包括一个已排序的整型数组以及一个新的整数值。
在insertAndSort
函数内,使用二分查找算法来确定新值的插入位置。二分查找的步骤如下:
start
变量并设置为0,表示当前搜索范围的起始位置。end
变量并设置为数组长度减1,表示当前搜索范围的结束位置。start
大于end
,说明新值应该插入在start
位置上,跳到步骤4。mid
变量为(start + end) / 2
,表示当前搜索范围的中间位置。mid
位置的值,则将end
更新为mid - 1
,表示新值可能在左边的子数组中。start
更新为mid + 1
,表示新值可能在右边的子数组中。跳到步骤3。
根据二分查找算法的结果,将新值插入到数组中的正确位置。这可以通过使用System.arraycopy()
方法将插入位置以及之后的元素向后移动一位,并将新值插入到插入位置上完成。
返回插入后的有序数组。
下面是具体实现的Java代码示例:
public class Main {
public static void main(String[] args) {
int[] sortedArray = {1, 4, 6, 8, 10}; // 已排序的数组
int newValue = 5; // 新的整数值
int[] newArray = insertAndSort(sortedArray, newValue); // 插入并排序
for (int i = 0; i < newArray.length; i++) {
System.out.println(newArray[i]);
}
}
public static int[] insertAndSort(int[] sortedArray, int newValue) {
int start = 0;
int end = sortedArray.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (sortedArray[mid] == newValue) {
start = mid;
break;
} else if (sortedArray[mid] < newValue) {
start = mid + 1;
} else {
end = mid - 1;
}
}
int[] newArray = new int[sortedArray.length + 1];
System.arraycopy(sortedArray, 0, newArray, 0, start);
newArray[start] = newValue;
System.arraycopy(sortedArray, start, newArray, start + 1, sortedArray.length - start);
return newArray;
}
}
运行这段示例代码,将输出有序数组1, 4, 5, 6, 8, 10
。新值5
被成功插入到了正确的位置上。
这种方法能够在O(log n)
的时间复杂度内完成插入操作,而不需要对整个数组进行排序。
import java.util.Arrays;
public class ArraySort {
public static void main(String[] args) {
//初始数组:array
int[] array = new int[]{10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
int a = 63;
array = arrayAdd(a, array);
System.out.println(Arrays.toString(array));
a = 65;
array = arrayAdd(a, array);
System.out.println(Arrays.toString(array));
}
public static int[] arrayAdd(int a, int[] array) {
//采用二分法找到a在array中的大小位置;
int index = binarySearch(array, a);
//创建一个新数组,放置添加数a
int[] newArray = new int[array.length + 1];
//采用 System.arraycopy 方法复制数组
System.arraycopy(array, 0, newArray, 0, index);
newArray[index] = a;
System.arraycopy(array, index, newArray, index + 1, array.length - index);
return newArray;
}
private static int binarySearch(int[] array, int a) {
int low = 0;
int high = array.length - 1;
int mid = 0;
while (low <= high) {
//获取中间数编号
mid = (low + high) / 2;
//获取中间数
int midVal = array[mid];
//根据中间数与a大小,重新取值边界
if (midVal < a) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return mid;
}
}