将升序合并排序转换为降序(C)
Posted
技术标签:
【中文标题】将升序合并排序转换为降序(C)【英文标题】:Convert ascending merge sort to descending (C ) 【发布时间】:2021-12-09 05:51:12 【问题描述】:我有一个合并排序程序,它通过按升序对数组元素进行排序来给出输出,但我希望它按降序给出输出
void merge(int A[] , int mid, int low, int high)
int B[high+1];
int i = low, j = mid+1, k = low;
while (i <= mid && j <= high)
if (A[i] < A[j])
B[k] = A[i];
k++;
i++;
else
B[k] = A[j];
k++;
j++;
while (i<=mid)
B[k] = A[i];
k++;
i++;
while (j<=high)
B[k] = A[j];
k++;
j++;
// finally moving all ele of B to A
for (int i = low; i <= high; i++)
A[i] = B[i];
void mergesort(int A[], int low, int high)
int mid;
if (low<high)
mid = (low+high)/2 ;
mergesort(A, low, mid);
mergesort(A, mid+1, high);
merge(A, mid, low, high);
我的方法(无效): 由于数组 B[] 是按升序排序的(所以我们最后将它复制到数组 A[] 中),所以在将 B 的元素复制到 A 时,我尝试从 B[] 的最后一个索引复制到 A 的第一个索引[] 等等...
int h = high;
for (int i = low; i <= high; i++)
A[i] = B[h];
h--;
但我不知道为什么它不起作用。
【问题讨论】:
合并排序的唯一变化应该是在一个地方翻转比较。你能找到它吗? “没用”到底是什么意思?请edit您的问题并创建一个minimal reproducible example,即我们可以使用示例输入(如有必要)以及相应的输出和预期输出来编译和运行的程序。当您比较两个不同的版本(升序和降序)时,显示两个版本以及相应的输出。我建议添加带有硬编码输入数据的main
函数。您可以使用 #ifdef
#else
#endif
在单个源代码中实现这两种变体。
【参考方案1】:
如果您的代码运行良好,您只需在第 6 行更改比较。
来自:
if (A[i] < A[j])
到:
if (A[i] > A[j])
【讨论】:
以上是关于将升序合并排序转换为降序(C)的主要内容,如果未能解决你的问题,请参考以下文章