<?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[Mal wieder Quicksort - mal wieder nicht ganz richtig sortiert]]></title><description><![CDATA[<p>Hallo Forum,<br />
tut mir schon fast leid, dass ich ein weiteres Quicksort-thema eröffne. Ähnlich Beiträge gab es schon, allerdings kann ich die Lösung nicht transferieren.</p>
<p>Zur vorherigen Klärung von feldZeiger und feld_SORT_P:<br />
feldZeiger[Nr].z ist das Sortiermerkmal (double);<br />
Da ich die Nr von feldZeiger auf jeden Fall noch brauche, also nicht einfach den &quot;z&quot; Wert hin und her schieben kann, benutze ich feld_SORT_P um der Sortierungsreihenfolge einen feldZeiger zuordnen zu können. Hoffe das war einigermaßen klar <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=":-/"
      alt="😕"
    /></p>
<p>Folgenden Code habe ich:</p>
<pre><code class="language-cpp">void Hoehensortierung(int left, int right)
{
	int i = left;
	int j = right;
	int tmp;
	double pivot = feldZeiger[feld_SORT_P[(left + right) / 2&rsqb;&rsqb;.z; 

	//Partitionieren
	while (i&lt;=j)
	{

		while(feldZeiger[feld_SORT_P[i&rsqb;&rsqb;.z &lt; pivot &amp;&amp; i&lt;j) 
			i++; 
		while(feldZeiger[feld_SORT_P[j&rsqb;&rsqb;.z &gt;= pivot &amp;&amp; j&gt;i)
			j--;

		if(i&lt;=j)
		{
			tmp = feld_SORT_P[i];
			feld_SORT_P[i] = feld_SORT_P[j];
			feld_SORT_P[j] = tmp;
			i++;
			j--;
		}
	};
	//Stimmt bis hierhin bei einmaligem Durchlauf
	if(left &lt; j)
		Hoehensortierung(left, j);
	if(i &lt; right)
		Hoehensortierung(i+1, right);
}
</code></pre>
<p>Das Ergebniss ist statt 1, 2, 3, 4, 5, ...<br />
-&gt; 4, 1, 2, 3, danach wird es total hahnebüchen.<br />
Wäre sehr dankbar für Hilfe, irgendwo ist die Logiklücke und ich fühl mich wie der bekannte Ochs vorm Berg...<br />
Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267654/mal-wieder-quicksort-mal-wieder-nicht-ganz-richtig-sortiert</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 10:48:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267654.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 May 2010 21:02:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mal wieder Quicksort - mal wieder nicht ganz richtig sortiert on Thu, 27 May 2010 21:02:34 GMT]]></title><description><![CDATA[<p>Hallo Forum,<br />
tut mir schon fast leid, dass ich ein weiteres Quicksort-thema eröffne. Ähnlich Beiträge gab es schon, allerdings kann ich die Lösung nicht transferieren.</p>
<p>Zur vorherigen Klärung von feldZeiger und feld_SORT_P:<br />
feldZeiger[Nr].z ist das Sortiermerkmal (double);<br />
Da ich die Nr von feldZeiger auf jeden Fall noch brauche, also nicht einfach den &quot;z&quot; Wert hin und her schieben kann, benutze ich feld_SORT_P um der Sortierungsreihenfolge einen feldZeiger zuordnen zu können. Hoffe das war einigermaßen klar <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=":-/"
      alt="😕"
    /></p>
<p>Folgenden Code habe ich:</p>
<pre><code class="language-cpp">void Hoehensortierung(int left, int right)
{
	int i = left;
	int j = right;
	int tmp;
	double pivot = feldZeiger[feld_SORT_P[(left + right) / 2&rsqb;&rsqb;.z; 

	//Partitionieren
	while (i&lt;=j)
	{

		while(feldZeiger[feld_SORT_P[i&rsqb;&rsqb;.z &lt; pivot &amp;&amp; i&lt;j) 
			i++; 
		while(feldZeiger[feld_SORT_P[j&rsqb;&rsqb;.z &gt;= pivot &amp;&amp; j&gt;i)
			j--;

		if(i&lt;=j)
		{
			tmp = feld_SORT_P[i];
			feld_SORT_P[i] = feld_SORT_P[j];
			feld_SORT_P[j] = tmp;
			i++;
			j--;
		}
	};
	//Stimmt bis hierhin bei einmaligem Durchlauf
	if(left &lt; j)
		Hoehensortierung(left, j);
	if(i &lt; right)
		Hoehensortierung(i+1, right);
}
</code></pre>
<p>Das Ergebniss ist statt 1, 2, 3, 4, 5, ...<br />
-&gt; 4, 1, 2, 3, danach wird es total hahnebüchen.<br />
Wäre sehr dankbar für Hilfe, irgendwo ist die Logiklücke und ich fühl mich wie der bekannte Ochs vorm Berg...<br />
Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903441</guid><dc:creator><![CDATA[FlashMuller]]></dc:creator><pubDate>Thu, 27 May 2010 21:02:34 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder Quicksort - mal wieder nicht ganz richtig sortiert on Thu, 27 May 2010 21:24:17 GMT]]></title><description><![CDATA[<p>mit dem ganzen Code wäre es einfacher <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="😃"
    /></p>
<pre><code class="language-cpp">while(feldZeiger[feld_SORT_P[j&rsqb;&rsqb;.z &gt;= pivot &amp;&amp; j&gt;i)
</code></pre>
<p>Hier scheint mir das &gt;= falsch. &gt; sollte reichen, da das Pivot-Elemente ja die Mitte darstellt und nur die Elemente davor / dahinter jeweils auf die richtige Seite &quot;getauscht&quot; werden.</p>
<pre><code class="language-cpp">Hoehensortierung(i+1, right);
</code></pre>
<p>auch die +1 könnte weg.<br />
damit würde ja ein Element übersprungen und zwar das Element mit Wert i.<br />
Die rechte Seite sollte analog zur linken Seite durchgeführt werden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903445</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Thu, 27 May 2010 21:24:17 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder Quicksort - mal wieder nicht ganz richtig sortiert on Thu, 27 May 2010 21:43:52 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Antwort. Viel mehr code gibt es da eigentlich nicht, ausser die Definitionen von feldZeiger und feld_SORT_P:</p>
<pre><code class="language-cpp">class feld 
{
	public:
		int id;
		int x;
		int y;
		double z;
		int empf[8];
		double entw;
};
feld *feldZeiger; 
...
feldZeiger = new feld[xy_gesamt];
</code></pre>
<p>feld_SORT_P entspricht bei seiner Initialisierung der id von FeldZeiger.</p>
<p>Habe deine Tips umgesetzt. Das Ergebniss hat sich dadurch verändert, ist aber immernoch nicht richtig:<br />
1, 5, 2, 3, 4, 7, 6, 8, 9...<br />
Grüße und Danke soweit</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903451</guid><dc:creator><![CDATA[FlashMuller]]></dc:creator><pubDate>Thu, 27 May 2010 21:43:52 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder Quicksort - mal wieder nicht ganz richtig sortiert on Thu, 27 May 2010 22:11:33 GMT]]></title><description><![CDATA[<p>ich bleibe bei meinen Angaben von oben <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="😃"
    /><br />
allerdings würde ich das mit dem pivot-element etwas vereinfachen.<br />
du benotigst im Prinzip nur den Index des Pivot und ließt das direkt aus deinem<br />
Array aus.</p>
<pre><code class="language-cpp">// an den Anfang der Funktion
    int middle = (left + right) / 2;

    while (i&lt;=j)
    {
        while(feldZeiger[i].z &lt; feldZeiger[middle].z)
            i++;
        while(feldZeiger[j].z &gt; feldZeiger[middle].z)
            j--;

        // tausch
     };

    if(left &lt; j)
        Hoehensortierung(left, j);
    if(i &lt; right)
        Hoehensortierung(i, right);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1903457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903457</guid><dc:creator><![CDATA[BasicMan01]]></dc:creator><pubDate>Thu, 27 May 2010 22:11:33 GMT</pubDate></item><item><title><![CDATA[Reply to Mal wieder Quicksort - mal wieder nicht ganz richtig sortiert on Thu, 27 May 2010 22:30:30 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void Hoehensortierung(int left, int right)
{
	int i = left;
	int j = right;
	int middle = (left + right) / 2;
	int tmp;

	//Partitionieren
	while (i&lt;=j)
	{

		while(feldZeiger[feld_SORT_P[i&rsqb;&rsqb;.z &lt; feldZeiger[feld_SORT_P[middle&rsqb;&rsqb;.z) 
			i++; 
		while(feldZeiger[feld_SORT_P[j&rsqb;&rsqb;.z &gt; feldZeiger[feld_SORT_P[middle&rsqb;&rsqb;.z)
			j--;

		if(i&lt;=j)
		{
			tmp = feld_SORT_P[i];
			feld_SORT_P[i] = feld_SORT_P[j];
			feld_SORT_P[j] = tmp;
			i++;
			j--;
		}
	};

	if(left &lt; j)
		Hoehensortierung(left, j);
	if(i &lt; right)
		Hoehensortierung(i, right);
}
</code></pre>
<p>So funktionierts. Die Modifikation der beiden while-schleifen war der Schlüssel, wie es scheint.<br />
Danke für deine Hilfe.<br />
Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1903465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1903465</guid><dc:creator><![CDATA[FlashMuller]]></dc:creator><pubDate>Thu, 27 May 2010 22:30:30 GMT</pubDate></item></channel></rss>