C 合并排序算法问题:不同的输出
当合并发生时,我正在进行合并排序,打印所有过程。我的朋友也在做同样的事。我们有两种不同的输出。我们似乎找不到问题所在。请帮忙 问题是我在数组中只有6个成员的5次通过,而我的朋友在相同的6个数字中获得13次通过,我们的coed几乎相同(根据我们的说法)。我们正在调用相同的东西,并已将“打印通行证”语句放在相同的位置 我给出了完整的代码和输出: 第1代码:C 合并排序算法问题:不同的输出,c,algorithm,sorting,mergesort,divide-and-conquer,C,Algorithm,Sorting,Mergesort,Divide And Conquer,当合并发生时,我正在进行合并排序,打印所有过程。我的朋友也在做同样的事。我们有两种不同的输出。我们似乎找不到问题所在。请帮忙 问题是我在数组中只有6个成员的5次通过,而我的朋友在相同的6个数字中获得13次通过,我们的coed几乎相同(根据我们的说法)。我们正在调用相同的东西,并已将“打印通行证”语句放在相同的位置 我给出了完整的代码和输出: 第1代码: #include <stdio.h> int size; int merge(int arr[], int l, int m,
#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");
}
#包括
整数大小;
整数合并(整数arr[],整数l,整数m,整数r){
int n1=m-l+1;
int n2=r-m;
int L[n1],R[n2];
int i,j;
对于(i=0;i 如果(L[i]第一个程序是正确的
第二个程序在m_sort()
函数中有一个错误:递归调用使用了不正确的索引值。它应该是:
void m_sort(int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
m_sort(start, mid); // instead of m_sort(0, mid)
m_sort(mid + 1, end);
merge(start, mid, end);
}
}
void m_排序(int开始,int结束){
如果(开始<结束){
int mid=(开始+结束)/2;
m_排序(开始,中间);//代替m_排序(0,中间)
m_排序(中间+1,结束);
合并(开始、中间、结束);
}
}
还请注意,第一个代码使用局部变量,除了仅用于显示相位的大小。第二个程序使用太多全局变量是没有充分理由的。第一个程序是正确的
第二个程序在m_sort()
函数中有一个错误:递归调用使用了不正确的索引值。它应该是:
void m_sort(int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
m_sort(start, mid); // instead of m_sort(0, mid)
m_sort(mid + 1, end);
merge(start, mid, end);
}
}
void m_排序(int开始,int结束){
如果(开始<结束){
int mid=(开始+结束)/2;
m_排序(开始,中间);//代替m_排序(0,中间)
m_排序(中间+1,结束);
合并(开始、中间、结束);
}
}
还请注意,第一个代码使用局部变量,除了只用于显示阶段的大小。第二个程序使用太多全局变量是没有充分理由的。m_sort(0,mid);
你能把它放到答案中,这样我就可以在那里打绿色勾吗?m_sort(0,mid)
你能把这个放在答案上,这样我就可以把绿色的勾号放在那里了吗?