繁体   English   中英

以排序方式在数组中插入整数的函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM