我已经完成了合并排序算法。我理解逻辑,但我不明白为什么我们必须将b []数组再次复制到[]数组中。我们在b []数组中输入的只是有序数字,对吧?但是,如果我们打印b []数组,我们会得到未排序的数组。一旦我们将它复制到[]数组中,我们就会得到正确的输出。谁能解释为什么我们必须将b []数组复制到[]数组?
算法:: 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];
}
我实施的计划:
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);
}
}
答案 0 :(得分:1)
合并排序的工作方式是将未排序的数据拆分为单个元素,将一个元素视为已排序,然后将它们合并为更大的排序块。
b
阵列是&#39;工作台&#39;在您的实现中,并且在每次迭代结束时(在您的示例中递归),保存迭代完成的工作的结果。通过将未排序数组的左侧和右侧复制到b
数组中来进行拆分。
为了在你来的时候建立合并后的结果&#39;备份&#39;通过拆分数组,您需要重新构建组件的结果,这是通过将已排序的块重新复制到其未分类的原始文件上来完成的。
如果更改递归,则可以避免复制,以便合并的方向(从左到右或从右到左/从低到高或从高到低)与递归的级别相对应。完全复制就地合并排序,没有b
数组,是一个更复杂的算法。