Sorting 合并排序算法的实现

Sorting 合并排序算法的实现,sorting,mergesort,Sorting,Mergesort,我已经通过了合并排序算法。我理解逻辑,但我不明白为什么我们必须将b[]数组再次复制到a[]数组中。我们在b[]数组中输入的只是排序的数字,对吗?但是,如果我们打印b[]数组,我们将得到未排序的数组。一旦我们将它复制到a[]数组中,我们就得到了正确的输出。谁能解释一下为什么我们必须将b[]数组复制到a[]数组中 算法:: void MergeSort(int low, int high) { if (low < high) { int mid = (low + hi

我已经通过了合并排序算法。我理解逻辑,但我不明白为什么我们必须将
b[]
数组再次复制到
a[]
数组中。我们在
b[]
数组中输入的只是排序的数字,对吗?但是,如果我们打印
b[]
数组,我们将得到未排序的数组。一旦我们将它复制到
a[]
数组中,我们就得到了正确的输出。谁能解释一下为什么我们必须将
b[]
数组复制到
a[]
数组中

算法::

void MergeSort(int low, int high) {
    if (low < high) { 
        int mid = (low + high) / 2;
        MergeSort(low, mid);
        MergeSort(mid + 1, high);
        Merge(low, mid, high);
    }
}

void Merge(int low, int mid, int high) {
    int h = low, i = low, j = mid + 1, k;
    while ((h <= mid) && (j <= high)) {
        if (a[h] <= a[j]) { 
            b[i] = a[h]; 
            h++;
        } else { 
            b[i] = a[j]; 
            j++;
        }
        i++;
    }
    if (h > mid) 
        for (k = j; k <= high; k++) {
            b[i] = a[k]; i++;
        }
    else 
        for (k = h; k <= mid; k++) {
            b[i] = a[k]; i++;
        }
    for (k = low; k <= high; k++) 
        a[k] = b[k];
}
void合并排序(整数低,整数高){
如果(低<高){
int mid=(低+高)/2;
合并排序(低、中);
合并排序(中+1,高);
合并(低、中、高);
}
}
无效合并(整数低、整数中、整数高){
int h=低,i=低,j=中+1,k;

而((hMerge-sort)的工作原理是将未排序的数据拆分为单独的元素,单个元素被视为已排序,然后将它们合并成更大的排序块

b
数组是您实现中的“工作台”,在每次迭代结束时(在您的示例中为递归),保存该迭代完成的工作的结果。拆分是通过将未排序数组的左侧和右侧复制到
b
数组中形成的

为了在拆分数组“备份”时生成合并结果,需要从组件重新生成结果,这是通过将已排序的块复制回未排序的原始块来完成的


如果更改递归以使合并方向(从左到右或从右到左/从低到高或从高到低)不变,则可以避免复制与递归级别相对应。不带
b
数组的完整就地复制合并排序是一个更复杂的算法。请在调用合并排序函数的位置添加代码,以便我们可以看到使用
a
b
数组的上下文。这将有助于了解它们的含义tain在通话前和通话后都应该包含。更新了我执行的程序。可能重复。这个答案中有一个很好的解释,比我的好得多!
import java.util.Arrays;

public class Msort {
    public static void msort(int[] arr, int l, int h) {
        int m;
        if (l < h) {
            m = (l + h) / 2;
            msort(arr, l, m);
            msort(arr, m + 1, h);
            merge(arr, l, m, h);
        }
    }

    public static void merge(int arr[], int l, int m, int h) {
        int i = l, j = m + 1, k = l, n;
        int[] sarr = new int[arr.length];
        while ((i <= m) && (j <= h)) {
            if (arr[i] <= arr[j]) {
                sarr[k] = arr[i];
                i++;
            } else {
                sarr[k] = arr[j];
                j++;
            }
            k++;
        }
        if (i <= m) {
            for (n = i; n <= m; n++) {
                sarr[k] = arr[n];
                k++;
            }
        } else {
            for (n = j; n <= h; n++) {
                sarr[k] = arr[n];
                k++;
            }
        }

        for (k = l; k <= h; k++) {
            arr[k] = sarr[k];
        }
        System.out.println("arr" + Arrays.toString(arr));
    }

    public static void main(String[] args) {
        int[] arr = { 12, 11, 13, 5, 6, 7 };

        Msort.msort(arr, 0, arr.length - 1);
    }
}