2017-05-11 4 views
0

Ich habe folgenden Code in c geschrieben, aber die Ausgabe des folgenden Programms ist immer ein Array von Müll Wert, meine alle eingegebenen Ganzzahlen werden irgendwo verloren, bitte helfen und sagen Sie mir, was und wo Fehler ist. danke :)Merge Sortierung gibt Müll Wert als Ausgabe

#include<stdio.h> 
#include<malloc.h> 

void merge(int a[],int beg,int mid,int end) 
{ 
    int n1=mid-beg+1; 
    int n2=end-mid; 
    int i=0,j=0,k=0; 

    int *p1 = (int*)malloc((n1)*sizeof(int)); 
    int *p2 = (int*)malloc((n2)*sizeof(int)); 

    for(i=0;i<n1;i++) 
     p1[i]=a[beg+i]; 

    for(j=0;j<n2;j++) 
     p2[j]=a[mid+1+j]; 
    i=j=0; 

    for(k=beg;k<=end;k++) 
    { 
     if(p1[i]<=p2[j]) 
     { 
      a[k]=p1[i]; 
      i=i+1; 
     } 
     else { 
      a[k]=p2[j]; 
      j=j+1; } 
    } 
} 
void merge_sort(int a[],int beg,int end) 
{ 
    if(beg<end) 
    { 
     int mid=(beg+end)/2; 

     merge_sort(a,beg,mid); 
     merge_sort(a,mid+1,end); 
     merge(a,beg,mid,end); 
    } 
} 
void main() 
{ 
    printf("Enter Array of size 10:\n"); 
    int a[10],i; 
    for(i=0;i<10;i++) 
     scanf("\n%d",&a[i]); 

    int n=sizeof a/sizeof a[0]; 

    merge_sort(a,0,n-1); 

    printf("\nSorted array is:\n"); 
    for(i=0;i<10;i++) 
     printf("%d\n",a[i]); 

} 
+0

Sie haben die Bedingung nicht berücksichtigt, wenn "i> = n1" oder "j> = n2", aber immer noch "k <= Ende". –

+0

Und Sie müssen Ihren Code formatieren. –

+1

Willkommen bei StackOverflow. Bitte nehmen Sie die [Tour], lernen, gute Fragen zu stellen stackoverflow.com/help/how-to-ask, machen eine [MCVE]. Mcve sollte Sample Inout, gewünschte Ausgabe, tatsächliche Ausgabe und wie es fehlschlägt, d. H. Was es "Müll" macht, enthalten. Verwenden Sie die richtige Formatierung und Einrückung für Ihren Code. Wenn Sie Hilfe mit Debugging-Code suchen, siehe https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Yunnosch

Antwort

0

Sie haben nicht für den Zustand geprüft, wo man alle Elemente des Arrays im Ergebnis gesetzt werden, während einige Elemente in der zweiten Anordnung sind noch nicht an der richtigen Stelle.

nur für das Verständnis versuchen Sie merge Verfahren auf den folgenden Eingaben laufen -
a - {1,2,3,4,10,11,12,13,14}
beg - 0
end - 8
mid - 4

In Ihrer void merge(int a[],int beg,int mid,int end) Funktion die dritte for Schleife ersetzen mit -

for(k=beg;i<n1 && j<n2;k++) 
{ 
    if(p1[i]<=p2[j]) 
     a[k]=p1[i++]; 
    else 
     a[k]=p2[j++]; 
} 
while(i<n1) 
    a[k++] = p1[i++]; 
while(j<n2) 
    a[k++] = p2[j++]; 
+0

warum wir zwei While-Schleifen am Ende verwenden? Ich habe es nicht verstanden. Ihre Lösung funktioniert alles gut, aber ich möchte wissen, wie und was vorher schief gelaufen ist. Tut mir leid, wenn ich sauer auf – LOKI

+0

@LOKI Stellen Sie sich das Array, das ich in meiner Antwort erwähnt. Wenn Sie die Merge-Prozedur 'p1 - {1,2,3,4,10}' und 'p2 - {11,12,13,14}' anwenden. Jetzt kopiert dritte Schleife alle Elemente von p1, während keine von p2 kopiert wird. jedes Element von 'p1' ist kleiner als' p2'. Aber Ihre dritte for-Schleife endet nicht als stil 'k n1" und der Code logisch falsch ist. In meinem Code überprüfe ich die Bedingung "i

+0

danke bro, ich habe das :) eine weitere Frage, jemand kommentiert, dass ich malloc nicht typecaste es kann dazu führen, dass einige Probleme können Sie mir sagen, was auftreten kann ?? – LOKI

0

Die Funktion der Zusammenführung ist falsch. Und Folgendes könnte funktionieren.

#include <stdio.h> 
#include <malloc.h> 

void merge(int a[],int beg,int mid,int end) 
{ 
    int n1=mid-beg+1; 
    int n2=end-mid; 
    int i=0,j=0,k=0; 

    int *p1 = (int*)malloc((n1)*sizeof(int)); 
    int *p2 = (int*)malloc((n2)*sizeof(int)); 

    for(i=0;i<n1;i++) 
     p1[i]=a[beg+i]; 

    for(j=0;j<n2;j++) 
     p2[j]=a[mid+1+j]; 
    i=j=0; 

    for(k=beg;k<=end;k++) 
    { 
     if (j >= n2 || (i < n1 && p1[i]<=p2[j])) 
     { 
      a[k]=p1[i]; 
      i=i+1; 
     } 
     else 
     { 
      a[k]=p2[j]; 
      j=j+1; 
     } 
    } 
} 

void merge_sort(int a[],int beg,int end) 
{ 
    if(beg<end) 
    { 
     int mid=(beg+end)/2; 

     merge_sort(a,beg,mid); 
     merge_sort(a,mid+1,end); 
     merge(a,beg,mid,end); 
    } 
} 

int main() 
{ 
    printf("Enter Array of size 10:\n"); 
    int a[10],i; 
    for(i=0;i<10;i++) 
     scanf("\n%d",&a[i]); 

    int n = sizeof a/sizeof a[0]; 

    merge_sort(a,0,n-1); 

    printf("\nSorted array is:\n"); 
    for(i=0;i<10;i++) 
     printf("%d\n",a[i]); 

    return 0; 
}