归并排序算法问题:不同的输出
Posted
技术标签:
【中文标题】归并排序算法问题:不同的输出【英文标题】:merge sort algorithm problem: different outputs 【发布时间】: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);
你能把这个放到答案中,这样我就可以把绿色的勾放在那里吗?
【参考方案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);
另请注意,第一个代码使用局部变量,除了仅用于显示阶段的 size
。第二个程序无缘无故地使用了太多的全局变量。
【讨论】:
以上是关于归并排序算法问题:不同的输出的主要内容,如果未能解决你的问题,请参考以下文章
在路上---学习篇Python 数据结构和算法 --希尔排序归并排序