<?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[Alle guten Dinge sind drei: MergeSort]]></title><description><![CDATA[<p>Guten Abend zusammen,<br />
vor längerer Zeit habe ich mich mit volkard über den MergeSort unterhalten. Ich wollte diesen noch ein bisschen abändern, doch seit meiner Änderung geht der Algorithmus - welch ein Wunder - nicht mehr. Erst mal der Code:</p>
<pre><code class="language-cpp">void MergeSort(int *arr, int iBegin, int iEnd)
{
  if(iEnd-iBegin&lt;=1)
   return;
  int iMitte=(iBegin+iEnd)/2;
  MergeSort(arr,iBegin,iMitte);
  MergeSort(arr,iMitte+1,iEnd);

  int i = iBegin;
  int j = iMitte+1;
  int k = 0;
  int* ipTemp = new int[iEnd-iBegin];
  while (i &lt;= iMitte &amp;&amp; j &lt; iEnd)
  {
   if (arr[i] &lt; arr[j]) {
    ipTemp[k] = arr[i];
    ++i;
   }
   else
   {
    ipTemp[k] = arr[j];
    ++j;
   }
   ++k;
  }
  while (i &lt;= iMitte)
  {
   ipTemp[k] = arr[i];
    ++i;
    ++k;
   }
  while (j &lt; iEnd)
  {
    ipTemp[k] = arr[j];
    ++j;
    ++k;
   }
  for (int iIndex = 0; iIndex &lt; iEnd-iBegin; ++iIndex) {
   arr[iIndex+iBegin] = ipTemp[iIndex];
  }
  delete [] ipTemp;
}
</code></pre>
<p>Könnt ihr mir helfen den Fehler zu finden, da nicht korrekt sortiert wird. Ich vermute, dass es entweder mit der Mitte zu tun hat oder mit dem Kopieren des temp Arrays in das ursprüngliche Array. Ich finde dennoch den Fehler nicht.</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/257037/alle-guten-dinge-sind-drei-mergesort</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 15:25:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257037.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Dec 2009 19:48:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Mon, 21 Dec 2009 19:48:40 GMT]]></title><description><![CDATA[<p>Guten Abend zusammen,<br />
vor längerer Zeit habe ich mich mit volkard über den MergeSort unterhalten. Ich wollte diesen noch ein bisschen abändern, doch seit meiner Änderung geht der Algorithmus - welch ein Wunder - nicht mehr. Erst mal der Code:</p>
<pre><code class="language-cpp">void MergeSort(int *arr, int iBegin, int iEnd)
{
  if(iEnd-iBegin&lt;=1)
   return;
  int iMitte=(iBegin+iEnd)/2;
  MergeSort(arr,iBegin,iMitte);
  MergeSort(arr,iMitte+1,iEnd);

  int i = iBegin;
  int j = iMitte+1;
  int k = 0;
  int* ipTemp = new int[iEnd-iBegin];
  while (i &lt;= iMitte &amp;&amp; j &lt; iEnd)
  {
   if (arr[i] &lt; arr[j]) {
    ipTemp[k] = arr[i];
    ++i;
   }
   else
   {
    ipTemp[k] = arr[j];
    ++j;
   }
   ++k;
  }
  while (i &lt;= iMitte)
  {
   ipTemp[k] = arr[i];
    ++i;
    ++k;
   }
  while (j &lt; iEnd)
  {
    ipTemp[k] = arr[j];
    ++j;
    ++k;
   }
  for (int iIndex = 0; iIndex &lt; iEnd-iBegin; ++iIndex) {
   arr[iIndex+iBegin] = ipTemp[iIndex];
  }
  delete [] ipTemp;
}
</code></pre>
<p>Könnt ihr mir helfen den Fehler zu finden, da nicht korrekt sortiert wird. Ich vermute, dass es entweder mit der Mitte zu tun hat oder mit dem Kopieren des temp Arrays in das ursprüngliche Array. Ich finde dennoch den Fehler nicht.</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826083</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 21 Dec 2009 19:48:40 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Mon, 21 Dec 2009 21:05:49 GMT]]></title><description><![CDATA[<p>Bin mir nicht sicher, aber das ++iIndex in der letzten for-Schleife, müsste das nicht iIndex++ heissen?</p>
<p>Sosnt fängt der ja beim iBegin+1-ten Index an.<br />
Das erste Element ist doch aber beim iBegin-ten Index, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826117</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Mon, 21 Dec 2009 21:05:49 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Tue, 22 Dec 2009 12:23:52 GMT]]></title><description><![CDATA[<p>/edit Pumu: sinnfreien Beitrag gelöscht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826119</guid><dc:creator><![CDATA[looooooooooooooooooooool]]></dc:creator><pubDate>Tue, 22 Dec 2009 12:23:52 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Tue, 22 Dec 2009 12:22:05 GMT]]></title><description><![CDATA[<p>/edit pumu: Beleidigungen gelöscht.</p>
<p>Bei ++index fängt der in dem temporären Feld bei 1 an zu zählen.<br />
Das Feld ist aber von 0 an gefüllt. Da gibts auch nix zu lachen weil irgendwie scheinst du keine Ahnung zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826123</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Tue, 22 Dec 2009 12:22:05 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Mon, 21 Dec 2009 21:22:57 GMT]]></title><description><![CDATA[<p>Max3000 schrieb:</p>
<blockquote>
<p>Bin mir nicht sicher, aber das ++iIndex in der letzten for-Schleife, müsste das nicht iIndex++ heissen?</p>
</blockquote>
<p>Das ist an dieser Stelle völlig egal. Das unterscheidet sich ausschließlich im Rückgabewert des Ausdrucks, und der wird hier nicht verwendet.</p>
<p>Max3000 schrieb:</p>
<blockquote>
<p>Bei ++index fängt der in dem temporären Feld bei 1 an zu zählen.</p>
</blockquote>
<p>Au weia.</p>
<p>Das Problem ist die Mitte-Berechnung. Wenn der iEnd-Parameter für &quot;Eins dahinter&quot; stehen soll, muss der iEnd-Parameter des ersten rekursiven Aufrufs gleich dem iBegin-Parameter des zweiten Aufrufs sein, sonst fehlt da was.</p>
<p>Am besten wirfst du das ganze +1 raus und machst aus den &lt;= einfach &lt;, dann passt's.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826127</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 21 Dec 2009 21:22:57 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Mon, 21 Dec 2009 21:35:23 GMT]]></title><description><![CDATA[<p>Warum muss es in diesem Forum eigentlich solche Deppen geben, die unangemeldet irgendeinen Mist posten?</p>
<p>Und tut mir ja leid falls ich mich geirrt habe.<br />
Dachte bei ++i wird i am Ende der Schleife erhöht.</p>
<p>Darf man sich nicht mal irren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826132</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Mon, 21 Dec 2009 21:35:23 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Tue, 22 Dec 2009 12:15:42 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
also ursprünglich war das auch ohne &quot;+1&quot; doch möchte ich dieses eigentlich beibehalten, da es dann verständlicher ist. Wenn bei &quot;iMitte&quot; aufgehört wird und bei &quot;iMitte&quot; angefangen wird, kann das erstmal zur Verwirrung führen. Ich höre also <strong>mit</strong> der Mitte auf und fange <strong>dahinter</strong> wieder an. Deswegen wollte ich das umschreiben, doch es funktioniert nicht.</p>
<p>Was muss ich noch ändern, weil ich eigentlich dachte, dass ich alle &quot;Größer-Kleiner-Zeichen&quot; bereits angeglichen habe?</p>
<p>Vielen Dank :xmas2:<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826326</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Tue, 22 Dec 2009 12:15:42 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Tue, 22 Dec 2009 12:21:26 GMT]]></title><description><![CDATA[<p>Max3000 schrieb:</p>
<blockquote>
<p>Warum muss es in diesem Forum eigentlich solche Deppen geben, die unangemeldet irgendeinen Mist posten?</p>
</blockquote>
<p>Einfach nicht drauf eingehen ist die beste Reaktion. Mit Beleidigungen und Beschimpfungen zu reagieren die denkbar schlechteste, damit fütterst du die Trolle nicht nur, sondern begibst dich zusätzlich auch noch auf ihr Niveau. Bitte unterlass derartige Äußerungen in Zukunft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826330</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 Dec 2009 12:21:26 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Tue, 22 Dec 2009 12:59:30 GMT]]></title><description><![CDATA[<p>Kinderlein, ich beende hiermit den Streit. Ich brauch eher Antworten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> KÖnnt ihr mir helfen?</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826350</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Tue, 22 Dec 2009 12:59:30 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Tue, 22 Dec 2009 14:09:43 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>also ursprünglich war das auch ohne &quot;+1&quot; doch möchte ich dieses eigentlich beibehalten, da es dann verständlicher ist.</p>
</blockquote>
<p>Es ist dann aber falsch.</p>
<p>freakC++ schrieb:</p>
<blockquote>
<p>Wenn bei &quot;iMitte&quot; aufgehört wird und bei &quot;iMitte&quot; angefangen wird, kann das erstmal zur Verwirrung führen.</p>
</blockquote>
<p>Sollte es nicht. Alle Algorithmen, die auf Sequenzen arbeiten, erwarten einen Iterator auf das Startelement sowie einen Iterator <strong>hinter</strong> <em>(nicht auf)</em> das Endelement. Und genau so wird der iEnd-Parameter ja auch behandelt. Du sortierst bis &lt; iEnd, nicht &lt;=.</p>
<p>freakC++ schrieb:</p>
<blockquote>
<p>Ich höre also <strong>mit</strong> der Mitte auf und fange <strong>dahinter</strong> wieder an.</p>
</blockquote>
<p>Nein, du hörst <strong>eins vor der Mitte</strong> auf und fängst hinter der Mitte wieder an. Du lässt also das Element an der Mitte-Position aus.</p>
<p>freakC++ schrieb:</p>
<blockquote>
<p>Deswegen wollte ich das umschreiben, doch es funktioniert nicht.</p>
</blockquote>
<p>Du kannst deine Sortierfunktion natürlich so umschreiben, dass sie semantisch anders arbeitet als alle Algorithmen der Standardbibliothek, aber davon rate ich ab. <strong>Das</strong> würde nämlich zu Verwirrung führen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826401</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Tue, 22 Dec 2009 14:09:43 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Tue, 22 Dec 2009 14:22:28 GMT]]></title><description><![CDATA[<p>Hallo MFK,<br />
vielen Dank für deine Hilfe.</p>
<blockquote>
<p>Nein, du hörst eins vor der Mitte auf und fängst hinter der Mitte wieder an. Du lässt also das Element an der Mitte-Position aus.</p>
</blockquote>
<p>1.) Das verstehe ich nicht so richtig. Das mittige Element kann doch nicht einfach ausgelassen werden. Was verstehe ich da falsch?</p>
<p>2.) Wenn ich mir folgenden Aufruf anschaue:</p>
<pre><code class="language-cpp">MergeSort(arr,iBegin,iMitte);
	MergeSort(arr,iMitte,iEnd);
</code></pre>
<p>dann würde ich als Laise denken, dass das mittlere Element doppelt genommen wird. Wie ich von dir nun schon erfahren habe, ist das nicht der Fall, doch könntest Du einfach nochmal wiederholfen, warum? Das habe ich leider noch immer nicht so ganz begriffen.</p>
<p>3.) Ich wollte es nun umschreiben (ich werde es aufgrund deines letzten Post nun doch lassen, da Du einfach mehr weißt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ), doch nehmen wir es trotzdem einmal an:</p>
<pre><code class="language-cpp">void MergeSort(int* arr, int iBegin, int iEnd)
{
	if(iEnd-iBegin &lt;= 1)
		return;
	int iMitte = (iBegin + iEnd)/2;
	MergeSort(arr,iBegin,iMitte);
	MergeSort(arr,iMitte+1,iEnd);

	int i = iBegin;
	int j = iMitte+1;
	int k = 0;

	int* temp = new int [iBegin-iEnd]; //iBegin-iEnd: Anzahl der Elemente in arr (virtuell)

	while(i &lt;= iMitte &amp;&amp; j &lt; iEnd)
	{
		if(arr[i] &lt; arr[j])
		{
			temp[k] = arr[i];
			i++;
		}
		else
		{
			temp[k] = arr[j];
			j++;
		}
		k++;
	}

}
</code></pre>
<p>Wenn ich nun in der while Schleife &lt; iEnd schreibe, wird dann nicht ein Element ausgelassen? Gleichzeitig darf ich aber auch nicht &lt;= schreiben, da ich sonst beim ganzen Array auf ein nicht vorhandenes Element zugreifen würde. Ist das vielleicht auch der Grund, warum man nicht &quot;iMitte+1&quot; schreiben sollte?</p>
<p>Ich danke dir nochmals und hoffe, dass ich bald alles verstehe!<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826406</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Tue, 22 Dec 2009 14:22:28 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Tue, 22 Dec 2009 14:48:20 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<blockquote>
<p>Nein, du hörst eins vor der Mitte auf und fängst hinter der Mitte wieder an. Du lässt also das Element an der Mitte-Position aus.</p>
</blockquote>
<p>1.) Das verstehe ich nicht so richtig. Das mittige Element kann doch nicht einfach ausgelassen werden. Was verstehe ich da falsch?</p>
</blockquote>
<p>Damit wollte ich ausdrücken, was dein veränderter Code tut. Natürlich sollte es nicht so sein.</p>
<p>freakC++ schrieb:</p>
<blockquote>
<p>2.) Wenn ich mir folgenden Aufruf anschaue:</p>
<pre><code class="language-cpp">MergeSort(arr,iBegin,iMitte);
	MergeSort(arr,iMitte,iEnd);
</code></pre>
<p>dann würde ich als Laise denken, dass das mittlere Element doppelt genommen wird. Wie ich von dir nun schon erfahren habe, ist das nicht der Fall, doch könntest Du einfach nochmal wiederholfen, warum? Das habe ich leider noch immer nicht so ganz begriffen.</p>
</blockquote>
<p>Es ist in der C++-Standardbibliothek üblich, dass man bei Algorithmen, die auf Sequenzen (also von/bis) arbeiten, zwei Iteratoren angibt: Einen auf das erste Element, und einen <strong>hinter</strong> das letze Element. Das ist konsequent durchgezogen, darum geben auch die end-Methoden aller Container einen Iterator <em>hinter</em> die Sequenz zurück, nicht aufs letzte Element.</p>
<p>Deine Sortierfunktion ist genauso angesetzt. Das erkennt man schon daran, dass insgesamt iBegin-iEnd Elemente sortiert werden. Das passt nur, wenn iEnd selbst nicht mit sortiert wird, sonst wäre das eins zu wenig.</p>
<p>Wenn also der iEnd-Parameter ein &quot;eins dahinter&quot;-Parameter ist, dann bewirkt der Aufruf MergeSort(arr,iBegin,iMitte), dass iMitte selbst nicht mit sortiert wird, denn iMitte zeigt ja <em>hinter</em> das letzte zu sortierende Element. Der andere Aufruf MergeSort(arr,iMitte+1,iEnd) sortiert iMitte aber auch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>freakC++ schrieb:</p>
<blockquote>
<p>Wenn ich nun in der while Schleife &lt; iEnd schreibe, wird dann nicht ein Element ausgelassen?</p>
</blockquote>
<p>Richtig.</p>
<p>freakC++ schrieb:</p>
<blockquote>
<p>Gleichzeitig darf ich aber auch nicht &lt;= schreiben, da ich sonst beim ganzen Array auf ein nicht vorhandenes Element zugreifen würde. Ist das vielleicht auch der Grund, warum man nicht &quot;iMitte+1&quot; schreiben sollte?</p>
</blockquote>
<p>Genau so ist es.</p>
<p>Wenn deine rekursiven Aufruf so richtig sein sollen (also einmal mit +1, einmal ohne), heißt das, dass bis iEnd <strong>einschließlich</strong> sortiert werden muss. Das hat weitreichende Folgen. Du musst die Funktion anders benutzen: Wenn du ein Array mit 4 Elementen hast, musst du die Funktion mit 0, 3 aufrufen statt mit 0, 4. Die Anzahl der zu sortierenden Elemente in der Funktion erhöht sich um eins.</p>
<p>Das ist möglich, aber eben von der Benutzung anders als alle Algorithmen der Standardbibliothek.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826419</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Tue, 22 Dec 2009 14:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to Alle guten Dinge sind drei: MergeSort on Tue, 22 Dec 2009 15:36:15 GMT]]></title><description><![CDATA[<p>Super, dann habe ich es verstanden.</p>
<p>Herzlichen Dank, MFK!</p>
<p>lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826449</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Tue, 22 Dec 2009 15:36:15 GMT</pubDate></item></channel></rss>