слияние с использованием C, вывод идет не так - PullRequest
0 голосов
/ 17 января 2019

Я написал код в 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 голосов
/ 17 января 2019

Добавьте приведенный ниже код в конец слияния, чтобы скопировать данные обратно. Есть более эффективные способы сделать это, чтобы избежать шага копирования назад, но по крайней мере это исправляет код.

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];
}
0 голосов
/ 17 января 2019

Вот рабочий код:

#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 относятся к началу каждого массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...