使用C的mergesort,输出出错

时间:2019-01-17 15:48:47

标签: c sorting data-structures

我在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

2 个答案:

答案 0 :(得分: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指向每个数组的开头。

答案 1 :(得分:0)

将以下所示的代码添加到合并末尾以将数据复制回去。有更有效的方法可以避免回退,但是至少可以解决此问题。

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];
}