【问题标题】:Inserting an integer into a sorted array将整数插入排序数组
【发布时间】:2023-05-11 17:49:01
【问题描述】:

我正在尝试编写一个方法,它接受一个排序数组和一个整数,创建一个大小大 1 的新数组,然后插入新整数并保持排序。

我已经尝试了几种不同的实现并让它们工作 - 但对于这个特定的实现,我不知道哪里出了问题。

    int[] array1 = new int[]{1, 2, 3, 4, 6, 7, 8};
    int[] printArray = insert(array1, 5);

是数组,方法是

public static int[] insert(int[] a, int k) {
    int[] s = new int[a.length + 1];
    for(int i = 0; i < a.length; i++) {
        if(k < s[i]) {
            s[i] = k;
            for(int j = i + 1; j < s.length; j++) {
                s[j] = a[i];
                i++;
            }
            return s;
        } else {
            s[i] = a[i];
        }
    }
    return s;
} 

此方法打印出 1、2、3、4、6、7、8、0,而不是 1、2、3、4、5、6、7、8。

【问题讨论】:

  • 你是对的,我打错了,它原本不打印5。

标签: java arrays sorting


【解决方案1】:

改变

if(k < s[i]) {

if(k < a[i]) {

在第 4 行。

【讨论】:

  • 我怎么会错过这个......一直盯着太多的a、k、j和i,它们看起来都一样。谢谢
  • @Turtle,好收获!!
  • @Turtle 我正在尝试再次使用 1 for 循环,你能看看这个:imgur.com/mp3oMs8
  • 正在打印1、2、3、4、5、0、7、8。插入后的数字总是出现0,然后正确完成数组。
  • @arthur change 'else{ s[]=...; }' 直接转换为 's[]=...'。希望你明白我的意思。
【解决方案2】:

实际上,在以下行中,您正在创建一个所有元素为零的数组:

int[] s = new int[a.length + 1];

s[0]s[7] 将是 0

您的循环计数器i0 运行到a.length,但需要注意的是数组s 的所有元素都将为零。您将ks[i] 进行比较,后者为零,因此数组的移动永远不会发生(如果块永远不会执行)。

你需要做两件事来修复它。

  1. a[0] 的值初始化s 的零元素。
  2. 将元素与前一个元素进行比较以确定要插入的位置。

最终代码为:

public static int[] insert(int[] a, int k) {
        int[] s = new int[a.length + 1];
        s[0] = a[0];
        for(int i = 1; i < a.length; i++) {
            if(k < s[i-1]) {
                s[i] = k;
                for(int j = i + 1; j < s.length; j++) {
                    s[j] = a[i];
                    i++;
                }
                return s;
            } else {
                s[i] = a[i];
            }
        }
        return s;
    }

现在您将获得: [1, 2, 3, 4, 6, 5, 7, 8]

【讨论】:

  • 这与值 int[] arr = {34,49,71,101,120,180} 不正确; int[] printArray = insert(arr, 5);
【解决方案3】:

我将首先使用Arrays.copyOf(int[], int) 创建一个比输入大一的新数组。然后迭代该数组,直到我到达新值所属的索引。然后使用System.arraycopy(Object,int,Object,int,int) 将值复制到数组的末尾。这可能看起来像

public static int[] insert(int[] a, int k) {
    int[] s = Arrays.copyOf(a, a.length + 1);
    for (int i = 0; i < s.length; i++) {
        if (a[i] < k) {
            continue;
        }
        System.arraycopy(a, i, s, i + 1, s.length - i - 1);
        s[i] = k;
        break;
    }
    return s;
}

我用Arrays.toString(int[]) 测试过

public static void main(String s[]) throws IOException {
    int[] array1 = new int[] { 1, 2, 3, 4, 6, 7, 8 };
    int[] printArray = insert(array1, 5);
    System.out.println(Arrays.toString(printArray));
}

我得到了(预期的)

[1, 2, 3, 4, 5, 6, 7, 8]

【讨论】:

  • 所以要将 John Smith 添加到电话簿中,您从第一页开始阅读电话簿直到 Joe Smith,然后添加新条目 :)