can wang
can wang

Reputation: 1

mergesort using C , the output goes wrong

I wrote the code in CodeBlocks 17.0.1
It seems that it only sorts some elements in the array, not all. Also, I can't find the differences between my code and the sample that I have and still don't know what goes wrong. Thank you for your help!

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

Output: 3.23 10.30 8.50

Upvotes: 0

Views: 38

Answers (2)

rcgldr
rcgldr

Reputation: 28828

Add the code shown below to the end of merge to copy the data back. There are more efficient ways to do this that avoid the copy back step, but at least this fixes the code.

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

Upvotes: 0

HmT
HmT

Reputation: 1036

Here is the working code:

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

still don't know what goes wrong

Why were you using two different arrays? Just one array is enough but it includes two logical arrays and the indexes l and m refer to the beginning of each array.

Upvotes: 1

Related Questions