以排序方式在数组中插入整数的函数
Function to insert integers in an array in a sorted way
所以假设我从数组 [0,0,0,0] 开始。在这个数组中,我将恰好添加 4 个值。让我们说2,1,3,4。所以我的主要功能看起来像:
public static void main(String[] args) {
int[] arr = new int[4];
insertSortedInArr(2,arr);
insertSortedInArr(1,arr);
insertSortedInArr(3,arr);
insertSortedInArr(4,arr);
}
我尝试了一种方法 insertSortedInArr()
的实现,该方法也是在网上找到的,但效果不佳。我试图找出它出了什么问题,但我无法找到错误。这是方法:
public static void insertSortedInArr(int val,int[] arr){
int i;
for(i=0;i<arr.length-1;i++){
if (arr[i] == 0){
arr[i] = val;
return;
}
if (val < arr[i])
// value must be inserted in arr[i]
break;
}
// move everything right
for(int k=i; k<arr.length-1; k++){
arr[k+1]=arr[k];
}
arr[i]=val;
}
此方法的输出结果为:[1, 2, 2, 4]
。
如果您能找到问题所在或更好地实现此方法,我们将不胜感激。谢谢
问题出在“将所有内容都正确”部分。
您正在从左到右迭代,但这将覆盖下一个元素。
相反,从右到左迭代:
for (int k=arr.length-1; k > i; k--){
arr[k]=arr[k - 1];
}
既然你已经知道了这些值,我想我们甚至不需要在这里循环。我们可以执行以下操作:
public static void insertSorted(int val, int arr[]) {
if(arr[val - 1] == 0) {
arr[val-1] = val;
}
}
或更好,只需将值以随机顺序插入数组,然后使用
Arrays.sort(arr);
希望对您有所帮助。
在检测应移动可用值的第一个空闲元素方面可以进行一些小的改进:
public static void insertSortedInArr(int val, int[] arr) {
int i;
for (i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
break;
} else if (val < arr[i]) {
int j;
for (j = i + 1; arr[j] != 0 && j < arr.length; j++); // find first 0
for (int k = j; k > i; k--) { // shift elements right to the first free cell
arr[k] = arr[k - 1];
}
break;
}
}
arr[i] = val;
System.out.println(Arrays.toString(arr));
}
测试:
int[] arr = new int[4];
insertSortedInArr(4,arr);
insertSortedInArr(2,arr);
insertSortedInArr(1,arr);
insertSortedInArr(3,arr);
输出:
[4, 0, 0, 0]
[2, 4, 0, 0]
[1, 2, 4, 0]
[1, 2, 3, 4]
所以假设我从数组 [0,0,0,0] 开始。在这个数组中,我将恰好添加 4 个值。让我们说2,1,3,4。所以我的主要功能看起来像:
public static void main(String[] args) {
int[] arr = new int[4];
insertSortedInArr(2,arr);
insertSortedInArr(1,arr);
insertSortedInArr(3,arr);
insertSortedInArr(4,arr);
}
我尝试了一种方法 insertSortedInArr()
的实现,该方法也是在网上找到的,但效果不佳。我试图找出它出了什么问题,但我无法找到错误。这是方法:
public static void insertSortedInArr(int val,int[] arr){
int i;
for(i=0;i<arr.length-1;i++){
if (arr[i] == 0){
arr[i] = val;
return;
}
if (val < arr[i])
// value must be inserted in arr[i]
break;
}
// move everything right
for(int k=i; k<arr.length-1; k++){
arr[k+1]=arr[k];
}
arr[i]=val;
}
此方法的输出结果为:[1, 2, 2, 4]
。
如果您能找到问题所在或更好地实现此方法,我们将不胜感激。谢谢
问题出在“将所有内容都正确”部分。
您正在从左到右迭代,但这将覆盖下一个元素。
相反,从右到左迭代:
for (int k=arr.length-1; k > i; k--){
arr[k]=arr[k - 1];
}
既然你已经知道了这些值,我想我们甚至不需要在这里循环。我们可以执行以下操作:
public static void insertSorted(int val, int arr[]) {
if(arr[val - 1] == 0) {
arr[val-1] = val;
}
}
或更好,只需将值以随机顺序插入数组,然后使用
Arrays.sort(arr);
希望对您有所帮助。
在检测应移动可用值的第一个空闲元素方面可以进行一些小的改进:
public static void insertSortedInArr(int val, int[] arr) {
int i;
for (i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
break;
} else if (val < arr[i]) {
int j;
for (j = i + 1; arr[j] != 0 && j < arr.length; j++); // find first 0
for (int k = j; k > i; k--) { // shift elements right to the first free cell
arr[k] = arr[k - 1];
}
break;
}
}
arr[i] = val;
System.out.println(Arrays.toString(arr));
}
测试:
int[] arr = new int[4];
insertSortedInArr(4,arr);
insertSortedInArr(2,arr);
insertSortedInArr(1,arr);
insertSortedInArr(3,arr);
输出:
[4, 0, 0, 0]
[2, 4, 0, 0]
[1, 2, 4, 0]
[1, 2, 3, 4]