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);
}
}