【发布时间】:2021-02-08 17:37:11
【问题描述】:
当合并发生时,我正在执行合并排序并打印所有通道。我的朋友也在做同样的事情。我们得到了两个不同的输出。我们似乎找不到问题所在。请帮忙!
问题是我在数组中有 6 个成员时只获得了 5 次传球,而我的朋友在相同的 6 位数字上获得了 13 次传球,我们的男女同校几乎相同(根据我们的说法)。我们调用了相同的东西,并且将打印通行证语句放在了相同的位置。
我给出完整的代码和输出:
第一个代码:
#include <stdio.h>
int size;
int merge(int arr[], int l, int m, int r) {
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2];
int i, j;
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1 + j];
i = 0, j = 0;
int k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++, k++;
}
while (j < n2) {
arr[k] = R[j];
j++, k++;
}
printf("\n pass: "); // PASSES
for (int x = 0; x < size; x++) {
printf("%d ", arr[x]);
}
}
int mergesort(int arr[], int l, int r) {
if (l < r) {
int m = (l + r) / 2;
mergesort(arr, l, m);
mergesort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
int main() {
printf("\n # MERGE SORT # \n\n");
int i;
int arr[20];
printf(" Enter number of array elements: ");
scanf("%d", &size);
printf(" Enter array elements: ");
for (i = 0; i < size; i++)
scanf("%d", &arr[i]);
mergesort(arr, 0, size - 1);
printf("\n\n Sorted array: ");
for (i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n\n\n");
}
输出:OP
第二个代码:
#include <stdio.h>
int arr[50];
int n;
int pass_count = 0;
void m_sort(int start, int end);
void merge(int start, int mid, int end);
int main() {
int i;
printf("\n\n______________MERGE SORT____________\n\n");
printf("\n HOW MANY ELEMENTS WOULD YOU LIKE TO ENTER? ");
scanf("%d", &n);
printf(" Give Array: ");
for (i = 0; i < n; i++)
scanf("%d", &arr[i]);
printf("\nYOUR ARRAY: ");
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
m_sort(0, n - 1);
printf("\n\n");
}
void m_sort(int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
m_sort(0, mid);
m_sort(mid + 1, end);
merge(start, mid, end);
}
}
void merge(int start, int mid, int end) {
int i, j, k;
int n1, n2;
n1 = mid - start + 1;
n2 = end - mid;
int left_arr[n1], right_arr[n2];
for (i = 0; i < n1; i++)
left_arr[i] = arr[start + i];
for (j = 0; j < n2; j++)
right_arr[j] = arr[mid + 1 + j];
i = 0;
j = 0;
k = start;
while (i < n1 && j < n2) {
if (left_arr[i] <= right_arr[j]) {
arr[k] = left_arr[i];
i++;
} else {
arr[k] = right_arr[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = left_arr[i];
i++;
k++;
}
while (j < n2) {
arr[k] = right_arr[j];
j++;
k++;
}
pass_count = pass_count + 1;
printf("\nPASS %d: ", pass_count); // PASSES
//displaying passes
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
}
输出:OP
提前致谢。
【问题讨论】:
-
m_sort(0,mid); -
你能把这个放到答案中,这样我就可以把绿色的勾放在那里吗?
标签: c algorithm sorting mergesort divide-and-conquer