[英]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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.