2016-07-20 7 views
0

Ich bekomme Segmentierung Fehler beim Implementieren von Mergesort. Ich habe für Array außerhalb der Grenzen überprüft. Ich würde einige Hilfe lieben, um herauszufinden, wo ich falsch gegangen bin. Ich habe Eingaben für kleine Arrays wie Größe 10 versucht, wo ich die Größe der Temperatur als statisch genommen habe (> 10). Ich habe mir stundenlang die Haare ausgezogen.Mergesort in C++: Segmentierung Fehler

UPDATE: Ich musste nur ändern mid = (low + high)/2.

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 

void merges(int arr[],int low,int mid,int high) 
{ 
    int i=low,j=mid+1,k=0; 
    int temp[high-low+1]; 
    while(i<=mid && j<=high) 
    { 
      if(arr[i]<arr[j]) 
      { 
       temp[k++]=arr[i]; 
       i++; 
      } 
      else 
      { 
       temp[k++]=arr[j]; 
       j++;    
      } 
    } 
    if(i>mid) 
    { 
     while(j<=high) 
     { 
      temp[k++]=arr[j]; 
      j++; 
     } 
    } 
    else 
    { 
     while(i<=mid) 
     { 
      temp[k++]=arr[i]; 
      i++; 
     } 
    } 
    j=0; 
    for(i=low;i<=high;i++) 
    { 
     arr[i]=temp[j++];  
    } 
} 

void mergesort(int arr[],int low,int high) 
{ 
    if(low<high) 
    { 
    int mid=low+high/2; 
    mergesort(arr,low,mid); 
    mergesort(arr,mid+1,high); 
    merges(arr,low,mid,high); 
    } 
} 

int main(){ 
    int n; 
    cin >> n; 
    int arr[n]; 
    for(int arr_i = 0;arr_i < n;arr_i++){ 
    cin >> arr[arr_i]; 
    } 
    int i,j,k; 
    mergesort(arr,0,n-1); 
    for(i=0;i<n;i++) 
     cout<<arr[i]; 
    return 0; 
} 
+1

Shen Sie erhalten Segmentierung Fehler unter Debugger sollte es zeigen, wo es passiert. Haben Sie es nicht unter dem Debugger ausgeführt oder verstecken Sie diese Informationen vor uns? – Slava

+0

Versuchen Sie, die Mitte zu ändern (niedrig + hoch)/2 statt niedrig + hoch/2 –

+0

Vorschlag - machen Sie 'mid' und' high' auf das Element hinter dem letzten Punkt, wie es C++ -Algorithmen tun. Vor allem das macht Ihren Code sauberer, zweitens können Sie einfach Standard-Algos verwenden (zum Beispiel 'std :: copy' anstelle von loop). Es gibt einen Grund, warum es so in C++ gemacht wird. – Slava

Antwort

-1

Sie rufen Mergesort rekursiv auf. Obwohl Ihr allgemeiner Fall legitim erscheint, kann ich Ihren Basisfall nicht feststellen (d. H. Die Rekursion beenden).

0

ich musste nur ändern mid = (low + high)/2. Vielen Dank @Gerado Gálvez für Ihren Vorschlag