当前位置: 首页 > 知识库问答 >
问题:

为什么在使用合并排序对数组排序时使用两个不同的循环变量?

梁丘佑运
2023-03-14

我正在学习对整数数组进行合并排序,当我注意到将排序后的数组元素复制到原始数组时,我们需要同时运行两个单独的循环变量,而这些索引处的值被复制到原始数组。以下是参考代码:

class MergeSort {
public static void sort(int arr[], int si, int ei, int mid) {

    int merged[] = new int[ei - si + 1];
    int index1 = si; // tracks the first array
    int index2 = mid + 1; // tracks the second array
    int i = 0;
    while (index1 <= mid && index2 <= ei) {
        if (arr[index1] <= arr[index2]) {
            merged[i++] = arr[index1++];
        } else {
            merged[i++] = arr[index2++];
        }
    } // end of while

    while (index1 <= mid) {
        merged[i++] = arr[index1++];
    }

    while (index2 <= ei) {
        merged[i++] = arr[index2++];
    }
    // to copy merged[] to arr[] 
        
    int j = si;
    for (i = 0; i < merged.length; i++, j++) {
        arr[j] = merged[i];
    }
} // end sort()

public static void divide(int arr[], int si, int ei) {
    //  base case
    if (si >= ei) {
        return;
    } // end of base case

    int mid = si + (ei - si) / 2; // same as (ei-si)/2 but with less space complexity
    divide(arr, si, mid);
    divide(arr, mid + 1, ei);
    sort(arr, si, ei, mid);
} // end of divide

public static void main(String args[]) {
    int arr[] = { 1, 8, 0, 7, -4 };
    int n = arr.length;
    divide(arr, 0, n - 1);

    for (int i = 0; i < n; i++) {
        System.out.print(arr[i] + " ");
    } // end of for
} // end of main
} // end of class

请注意,在将数组合并[]的值复制到数组arr[]时,我们使用了两个单独的变量ij。我确实尝试只使用一个循环变量,如下所示:

for (int i = 0; i < arr.length; i++) {
    arr[i] = merged[i];
}

但收到了不正确的输出。如果有人知道为什么我们需要两个独立的变量来进行操作,请告诉我。谢谢:)

共有1个答案

梁丘佑运
2023-03-14

您可以在最后一个循环中使用单个变量,但您必须在目标数组中添加切片开始的偏移量:

for (int i = 0; i < arr.length; i++) {
    arr[si + i] = merged[i];
}
 类似资料:
  • 我在C语言课程考试前练习一些算法问题,我被这个问题卡住了(至少3个小时甚至4个小时),我不知道如何回答: 您有两个已排序的循环单链接列表,必须合并它们并返回新循环链接列表的标题,而不创建任何新的额外节点。返回的列表也应该进行排序。 节点结构为: 我尝试了很多方法(递归和非递归),但都没有解决问题。 谢谢你的帮助。

  • 问题内容: 给定两个排序数组,如下所示: 我希望输出为: 要么: 我知道我可以执行以下操作: 我只是想知道是否有一种更快的方法,因为我要处理的数组具有数百万个元素。 任何想法都欢迎。谢谢 问题答案: 由于您使用numpy,因此我怀疑bisec根本不会对您有所帮助。因此,我建议您做两件事: 千万 不能 使用,使用方法,而不是这种种取代阵列,避免了复制。 必须使用没有到位的。因此,不要手动使用逻辑。I

  • 我的情况是这样的:我有两个带有不同类型对象的arraylists。每个对象都有一个字段名和一个字段日期ArrayList事件、ArrayList事物。我按名称对arraylists进行排序,如果名称相同,则按日期进行排序。 假设ArrayList1具有以下对象:event1 01.12、event1 05.12、event2 04.03、event3 05.05 我如何迭代两个arraylists

  • 我正在做算法的中期审查,我试图用Java实现所有的伪代码,以便更好地理解算法。但是在堆排序部分,我的代码有一些问题。我的输入数组是 {10,16,4,10,14,7,9,3,2,8,1} 第一个元素只是表示我想要排序的元素的数量。换句话说,需要排序的元素从索引1开始。 我的build max heap输出是:16 14 10 8 7 9 3 2 4 1 堆排序的输出是:1 3 2 4 7 8 9

  • 问题内容: 这是在采访中问我的,这是我提供的解决方案: 有没有更有效的方法可以做到这一点? 编辑:更正的长度方法。 问题答案: 稍有改进,但是在主循环之后,当到达另一个输入数组的末尾时,可以用来复制其中一个输入数组的结尾。但是,那不会改变你解决方案的性能特征。

  • 对于这个项目,我得到了一个字符串数组和一个整数数组。int[1]是字符串[1]的排名。我需要使用mergesort按1到n的顺序对int数组进行排序,我在下面已经完成了这项工作。但是当int数组被移动时,我还需要切换字符串数组的位置,以便它们都被排序,如果这有意义的话?我不知道我的编码有什么问题,甚至我的想法是否真的有效,但我一直在stringSorted[k]=stringRight[j]上得到