<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Mergesort Problem]]></title><description><![CDATA[<p>Hallo,<br />
ich stecke in einem Problem mit Mergesort, vor allem deswegen, weil ich mir Rekursionen noch immer nicht vorstellen kann (da verknotet sich mein Hirn <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> )</p>
<p>Hier einmal der Quellcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

void mergesort(int a[], int l, int r)
{
    int i, j, k, m;

    if(r &gt; 1)
    {
        int b[r];
        m = (r+l)/2;
        mergesort(a, l, m);
        mergesort(a, m+1, r);
        for (i= m+1; i&gt;l; i--) b[i-1] = a[i-1];
        for (j = m; j &lt; r; j++) b[r+m-j] = a[j+1];
        for(k=l; k&lt;= r; k++)
        a[k] = (b[i]&lt;b[j]) ? b[i++] : b[j--];
    }
    else
    return;
}

int main()
{
    int array[10]={5, 6, 1, 9, 3, 2, 7, 4, 8, 10};
    int n=10;
    mergesort(array,0,n);

    for (int i=1; i&lt;n; ++i)
       cout &lt;&lt; array[i];

     return 0;
}
</code></pre>
<p>Das Programm compiliert, nur dann gibt es ein Segmentation Fault. Meine Frage: Wie kann ich mir die Ausführung des Codes vorstellen und was läuft schief?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267415/mergesort-problem</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 12:41:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267415.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 May 2010 11:17:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mergesort Problem on Mon, 24 May 2010 11:17:48 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich stecke in einem Problem mit Mergesort, vor allem deswegen, weil ich mir Rekursionen noch immer nicht vorstellen kann (da verknotet sich mein Hirn <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> )</p>
<p>Hier einmal der Quellcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

void mergesort(int a[], int l, int r)
{
    int i, j, k, m;

    if(r &gt; 1)
    {
        int b[r];
        m = (r+l)/2;
        mergesort(a, l, m);
        mergesort(a, m+1, r);
        for (i= m+1; i&gt;l; i--) b[i-1] = a[i-1];
        for (j = m; j &lt; r; j++) b[r+m-j] = a[j+1];
        for(k=l; k&lt;= r; k++)
        a[k] = (b[i]&lt;b[j]) ? b[i++] : b[j--];
    }
    else
    return;
}

int main()
{
    int array[10]={5, 6, 1, 9, 3, 2, 7, 4, 8, 10};
    int n=10;
    mergesort(array,0,n);

    for (int i=1; i&lt;n; ++i)
       cout &lt;&lt; array[i];

     return 0;
}
</code></pre>
<p>Das Programm compiliert, nur dann gibt es ein Segmentation Fault. Meine Frage: Wie kann ich mir die Ausführung des Codes vorstellen und was läuft schief?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1901792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901792</guid><dc:creator><![CDATA[cliffhanger]]></dc:creator><pubDate>Mon, 24 May 2010 11:17:48 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort Problem on Mon, 24 May 2010 11:29:34 GMT]]></title><description><![CDATA[<p>Am besten du teilst dein Problem mal auf. Probier zuerst eine Funktion <code>merge</code> zu schreiben, welche dir 2 Arrays (respektive 2 Teilarrays) merged.</p>
<p>Dann kannst du das testen und schauen, ob das überhaupt richtig gemacht wird (ich vermute, dass der Fehler da liegt). Und das sortieren besteht dann nur noch aus dem aufteilen und mergen lassen.</p>
<p>Der Debugger kann dir in solchen Fällen auch recht gut helfen.</p>
<p>Die Idee hinter Mergesort ist, dass du einfach sagst, dass ein Array sortiert ist, wenn du 2 (sortierte) Teilarrays hast und diese dann zusammenfügst (merge). Nun machst du das so oft, bis du sicher bist, dass ein Array sortiert ist und das ist es, wenn du nur noch eine Zahl hast. Dann werden da auf der untersten Stufe 2 vorsortierte Zahlen (2 Zahlen) gemerged und dann 2x2 usw. bist das ganze Array sortiert ist. Mach das mal am besten von Hand, dann siehst du recht gut, wie das geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1901800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901800</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 24 May 2010 11:29:34 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort Problem on Mon, 24 May 2010 11:59:38 GMT]]></title><description><![CDATA[<p>cliffhanger schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

void mergesort(int a[], int l, int r)
{
    int i, j, k, m;
</code></pre>
</blockquote>
<p>Definire Deine Variablen dann, wenn Du sie brauchst. Nicht vorher ohne Grund.</p>
<p>cliffhanger schrieb:</p>
<blockquote>
<pre><code class="language-cpp">if(r &gt; 1)
    {
        int b[r];
</code></pre>
</blockquote>
<p>Schalte mal die Warnungen Deines Compilers ein. Wenn Dein Compiler dies hier frisst, liegt das an einer Erweiterung. Das ist kein C++. Er sollte Dich warnen. Bei so einem Array muss die Größe eine Compile-Zeit-Konstante sein. Hier ist <code>r</code> aber keine solche Konstante.</p>
<p>cliffhanger schrieb:</p>
<blockquote>
<pre><code class="language-cpp">m = (r+l)/2;
        mergesort(a, l, m);
        mergesort(a, m+1, r);
</code></pre>
</blockquote>
<p>Warum nicht mergesort(a,m,r); ? Offensichtlich ist die Linke Grenze bei dir inklusive und die rechte exklusive. Sonst würdest Du ein 10-elementiges Array nicht mit mergesort(dings,0,10); aufrufen.</p>
<p>cliffhanger schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for (i= m+1; i&gt;l; i--) b[i-1] = a[i-1];
        for (j = m; j &lt; r; j++) b[r+m-j] = a[j+1];
        for(k=l; k&lt;= r; k++)
        a[k] = (b[i]&lt;b[j]) ? b[i++] : b[j--];
</code></pre>
</blockquote>
<p>Hier ist mit Sicherheit der Wurm drin. Greifst Du hier nicht eventuell in der letzten Zeile auf Elemente zu, die es gar nicht gibt, weil die Indizes i bzw j eventuell schon &quot;hinter das Ende zeigen&quot;?</p>
<p>Ich schließe mich drakon an. Mach nicht alles in einer Funktion. Das mit dem temporären Array muss man auch nur einmal machen:</p>
<pre><code class="language-cpp">/// [left,centr) und [centr,end) sind schon sortiert.
/// Diese Funktion kombiniert beite Sequenzen und legt sie bei &quot;wohin&quot; ab.
void internal_merge(int const* left, int const* centr, int const* end, int* wohin)
{
  int const* p1 = left;
  int const* p2 = centr;
  while (p1!=centr &amp;&amp; p2!=end) {
    ...
  }
  while (p1!=centr)
    ...
  while (p2!=end)
    ...
}

void internal_mergesort(int len, int* arr, int* tmp)
{
   if (len&lt;2) return;
   int const l1 = len/2;
   int const l2 = len - l1;
   internal_mergesort(l1,arr   ,tmp   );
   internal_mergesort(l2,arr+l1,tmp+l1);
   internal_merge(arr,arr+l1,arr+len, /* --&gt; */ tmp);
   std::copy(tmp,tmp+len,arr);
}

void mergesort(int len, int arr[])
{
   std::vector&lt;int&gt; tmp (len);
   internal_mergesort(len,arr,&amp;tmp[0]);
}
</code></pre>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1901830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1901830</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 24 May 2010 11:59:38 GMT</pubDate></item></channel></rss>