将升序合并排序转换为降序(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)的主要内容,如果未能解决你的问题,请参考以下文章

根据索引将 nsmutablearray 排序为降序

C++中怎样把两个升序数组合并

如何在jqGrid中将初始排序顺序设置为降序

linux 中 ll 命令如何让查询结果按时间升序或降序排序?

js数组操作方法

奇数结点升序偶数结点降序的单链表排序(Python实现)