[C] Merge sort - segmentation fault

0

Cos tu jest nie tak, tylko nie wiem co.
z gory dzieki za pomoc

void sort_merge(int t[], int p, int r){
 if (p<r){
 int q= (p+r)/2;
 sort_merge(t,p,q);
 sort_merge(t, q+1, r);
 merge(t,p,q,r);}
}
////////////////////////////////////////
void merge(int t[], int p, int q, int r){
 int a=q-p+1;
 int b=r-q;
 
 int L[a+1], R[b+1];
 int i,j;
 for (i=0; i<a; ++i)
         L[i]=t[p+i];
 for (j=0; j<b; ++j)
        R[j]=t[q+j];

 L[a]=-1;
 R[b]=-1;
 i=0, j=0;
 int k;

 for (k=p; k<r; ++k){
         if (L[i]<=R[j])
                t[k]=L[i++];
               
           else
                t[k]=R[j++];
               
 }
}
0
void sort_merge(int t[], int p, int r){
 if (p<r);                             //to jest źle
 int q= (p+r)/2;
 sort_merge(t,p,q);
 sort_merge(t, q+1, r);
 merge(t,p,q,r);
}
////////////////////////////////////////
void merge(int t[], int p, int q, int r){
 int a=q-p+1;
 int b=r-q;
 
 int L[a+1], R[b+1];
 int i,j;
 for (i=0; i<a; ++i)
         L[i]=t[p+i];
 for (j=0; j<b; ++j)
        R[j]=t[q+j];            // to jest źle

 L[a]=-1;                     // to źle
 R[b]=-1;                    // jw
 i=0, j=0;
 int k;

 for (k=p; k<r; ++k){       // tu źle
         if (L[i]<=R[j])
                t[k]=L[i++];
               
           else
                t[k]=R[j++];
               
 }
}

To teraz już wiesz.

0

no tak, z tym ifem to pojechalem :D

ale pozostale, to nie wiem czemu sa zle...

ok, czyli if ma miec w sobie te ponizsze 4 linijki

oraz wartownicy powinni miec jakas duza liczbe np. 15000

0

W pierwszym forze, bo a to q-p+1, +1 jest kluczowe.
W drugim bierzesz o jeden element za mało.

Z wartownikami dobrze kombinujesz i podpowiem, że możesz użyć http://cplusplus.com/reference/clibrary/climits/

0

ja tez musze takie cos napisac, przerobilem to tak:

#include <stdio.h>
#include <limits.h>
void merge(int t[], int p, int q, int r);
void sort_merge(int t[], int p, int r);

int main(){

 int t[10]={4,7,3,67,4456,7,5,9,7,12};
 sort_merge(t,0,10);
 int i=0;
 for (i; i<10; ++i)
	printf("%d\t",t[i]);


return 0;
}

void sort_merge(int t[], int p, int r){
 if (p<r){
 int q=(p+r)/2;
 sort_merge(t,p,q);
 sort_merge(t, q+1, r);
 merge(t,p,q,r);}
}
///////////////////////////////////////////
void merge(int t[], int p, int q, int r){
 int a=q-p+1;
 int b=r-q;
 
 int L[a+1], R[b+1];
 int i,j;
 for (i=0; i<a; ++i)
         L[i]=t[p+i];
 for (j=0; j<b; ++j)
        R[j]=t[q+j+1];

 L[a]=INT_MAX;
 R[b]=INT_MAX;
 i=0, j=0;
 int k;

 for (k=p; k<r; ++k){
         if (L[i]<=R[j])
                t[k]=L[i++];
               
           else
                t[k]=R[j++];
               
 }
}

ale tez nie dziala, co tu jest zle? bo ja nie mam juz do tego glowy...

i mam pytanko, czy programista musi to z glowy umiec pisac, czy wystarczy jak rozumie co tu sie dzieje pokolei? :)

0

http://pl.wikipedia.org/wiki/Sortowanie_przez_scalanie

Ważne, że to rozumiesz bo wtedy napisanie nie jest problemem.

0
[...]
void merge(int t[], int p, int q, int r){
 int a=q-p+1;
 int b=r-q;
 
 int L[a+1], R[b+1];
 int i,j;
 for (i=0; i<a; ++i)
         L[i]=t[p+i];
 for (j=0; j<b; ++j)
        R[j]=t[q+j+1];

 L[a]=INT_MAX;
 R[b]=INT_MAX;
 i=0, j=0;
 int k;

 for (k=p; k<r; ++k){              //Tu jest źle i było to wcześniej wspomniane
                                    //bierzesz o 1 element za mało, ma być k<=r
         if (L[i]<=R[j])
                t[k]=L[i++];
               
           else
                t[k]=R[j++];
               
 }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1