【问题标题】:mergesort using C , the output goes wrong使用 C 进行归并排序,输出出错
【发布时间】:2019-01-17 15:48:46
【问题描述】:

我在 CodeBlocks 17.0.1 中编写了代码
它似乎只对数组中的一些元素进行排序,而不是全部。此外,我找不到我的代码和我拥有的示例之间的差异,并且仍然不知道出了什么问题。感谢您的帮助!

#include <stdio.h>
#include <stdlib.h>


void merge(float x[], float y[], int l, int m, int r)
{
    int ptr_1,ptr_2,ptr_y;
    ptr_1 = ptr_y = l;
    ptr_2 = m+1;
    while((ptr_1<=m) && (ptr_2<=r))
    {
        if(x[ptr_1] <= x[ptr_2])
            y[ptr_y++] = x[ptr_1++];
        else
        {
            y[ptr_y++] = x[ptr_2++];
        }
    }
    while(ptr_1<=m)
        y[ptr_y++] = x[ptr_1++];
    while(ptr_2<=r)
        y[ptr_y++] = x[ptr_2++];

}

void merge_sort(float a[],float b[],int l, int r)
{
    if(l < r)
    {   int m = l + (r-l)/2;
        merge_sort(a,b,l,m);
        merge_sort(a,b,m+1,r);
        merge(a,b,l,m,r);
    }

}

int main()
{
    float a[3] ={10.3,8.5,3.23},b[3];
    int i,j;
    float *temp = b;
    merge_sort(a,temp,0,2);
    for(i=0;i<3;i++)
    {
         printf("%.2f  ",b[i]);
    }
    printf("\n");
    system("pause");
    return 0;
}

输出:3.23 10.30 8.50

【问题讨论】:

  • SO 是一个糟糕的调试器。你做了什么研究?你试过调试这个吗?您的调试向您展示了什么? ericlippert.com/2014/03/05/how-to-debug-small-programs
  • 看起来您总是从 a 合并到 b。您永远不会将部分合并的结果复制回a,因此您在前面的步骤中所做的所有工作都会丢失。如果你有一个可行的例子,我建议你回去再看一遍。您似乎跳过了一段相当重要的代码。

标签: c sorting data-structures


【解决方案1】:

这是工作代码:

#include <stdio.h>
#include <stdlib.h>


void merge(float a[], int l, int m, int r)
{
    int i, j, k; 
    int n1 = m - l + 1; 
    int n2 =  r - m; 

    /* create temp arrays */
    float L[n1], R[n2]; 

    /* Copy data to temp arrays L[] and R[] */
    for (i = 0; i < n1; i++) 
        L[i] = a[l + i]; 
    for (j = 0; j < n2; j++) 
        R[j] = a[m + 1+ j]; 

    /* Merge the temp arrays back into arr[l..r]*/
    i = 0; // Initial index of first subarray 
    j = 0; // Initial index of second subarray 
    k = l; // Initial index of merged subarray 
    while (i < n1 && j < n2) 
    { 
        if (L[i] <= R[j]) 
        { 
            a[k] = L[i]; 
            i++; 
        } 
        else
        { 
            a[k] = R[j]; 
            j++; 
        } 
        k++; 
    } 

    /* Copy the remaining elements of L[], if there 
       are any */
    while (i < n1) 
    { 
        a[k] = L[i]; 
        i++; 
        k++; 
    } 

    /* Copy the remaining elements of R[], if there 
       are any */
    while (j < n2) 
    { 
        a[k] = R[j]; 
        j++; 
        k++; 
    } 
}

void merge_sort(float a[],int l, int r)
{
    if(l < r)
    {   int m = l + (r-l)/2;
        merge_sort(a,l,m);
        merge_sort(a,m+1,r);
        merge(a,l,m,r);
    }

}

int main()
{
    float a[3] ={10.3,8.5,3.23};
    int i,j;
    merge_sort(a,0,2);
    for(i=0;i<3;i++)
    {
         printf("%.2f  ",a[i]);
    }
    printf("\n");
    system("pause");
    return 0;
}

还是不知道怎么回事

你为什么使用两个不同的数组? 一个数组就足够了,但它包含两个逻辑数组,索引 l 和 m 指的是每个数组的开头。

【讨论】:

  • 欢迎您。如果您认为我的评论是正确答案,您可以将其标记为已接受答案。
【解决方案2】:

将下面显示的代码添加到合并的末尾以将数据复制回来。有更有效的方法可以避免复制返回步骤,但至少可以修复代码。

void merge(float x[], float y[], int l, int m, int r)
{
    /* after the last line in merge, (y[ptr_y++] = x[ptr_2++];) */
    /* add this code to copy from y[] back to x[] */

    for(ptr_1 = l; ptr_1 <= r; ptr1++)
        x[ptr_1] = y[ptr_1];
}

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2010-12-23
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多