<?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[Fehler in Quickselect Algorithmus]]></title><description><![CDATA[<p>hi,<br />
bitte um feedback zu meinem quickselect algo...der algo funktioniert nicht wenn ich doublicates habe...</p>
<pre><code>#include &lt;iostream&gt; 
#include &lt;vector&gt; 
#include &lt;algorithm&gt; 
#include &lt;ctime&gt; 
using namespace std;

int rand_partition(vector&lt;int&gt; &amp;a, int left, int right) {
	int pivotIndex = left + (rand() % (right - left));
	//int m = left + (right - left) / 2; //... to test the algo...no rand at this point 
	int pivot = a[pivotIndex];
	int i = left;
	int j = right;

	do {
		while (a[i] &lt; pivot) i++; // find left element &gt; pivot 
		while (a[j] &gt; pivot) j--; // find right element &lt; pivot 

		// if i and j not already overlapped, we can swap 
		if (i &lt; j) {
			swap(a[i], a[j]);
		}
	} while (i &lt; j);

	return i;
}

// Returns the n-th smallest element of list within left..right inclusive (i.e. n is zero-based). 
int quick_select(vector&lt;int&gt; &amp;a, int left, int right, int n) {
	if (left == right) {        // If the list contains only one element 
		return a[left];  // Return that element 
	}

	int pivotIndex = rand_partition(a, left, right);

	// The pivot is in its final sorted position 
	if (n == pivotIndex) {
		return a[n];
	}
	else if (n &lt; pivotIndex) {
		return quick_select(a, left, pivotIndex - 1, n);
	}
	else {
		return quick_select(a, pivotIndex + 1, right, n);
	}
}

int main() {

	vector&lt;int&gt; vec= {1, 0, 3, 5, 0, 8, 6, 0, 9, 0};

	cout &lt;&lt; quick_select(vec, 0, vec.size() - 1, 5) &lt;&lt; endl;

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/324032/fehler-in-quickselect-algorithmus</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 08:31:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324032.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 27 Feb 2014 19:11:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Thu, 27 Feb 2014 19:11:20 GMT]]></title><description><![CDATA[<p>hi,<br />
bitte um feedback zu meinem quickselect algo...der algo funktioniert nicht wenn ich doublicates habe...</p>
<pre><code>#include &lt;iostream&gt; 
#include &lt;vector&gt; 
#include &lt;algorithm&gt; 
#include &lt;ctime&gt; 
using namespace std;

int rand_partition(vector&lt;int&gt; &amp;a, int left, int right) {
	int pivotIndex = left + (rand() % (right - left));
	//int m = left + (right - left) / 2; //... to test the algo...no rand at this point 
	int pivot = a[pivotIndex];
	int i = left;
	int j = right;

	do {
		while (a[i] &lt; pivot) i++; // find left element &gt; pivot 
		while (a[j] &gt; pivot) j--; // find right element &lt; pivot 

		// if i and j not already overlapped, we can swap 
		if (i &lt; j) {
			swap(a[i], a[j]);
		}
	} while (i &lt; j);

	return i;
}

// Returns the n-th smallest element of list within left..right inclusive (i.e. n is zero-based). 
int quick_select(vector&lt;int&gt; &amp;a, int left, int right, int n) {
	if (left == right) {        // If the list contains only one element 
		return a[left];  // Return that element 
	}

	int pivotIndex = rand_partition(a, left, right);

	// The pivot is in its final sorted position 
	if (n == pivotIndex) {
		return a[n];
	}
	else if (n &lt; pivotIndex) {
		return quick_select(a, left, pivotIndex - 1, n);
	}
	else {
		return quick_select(a, pivotIndex + 1, right, n);
	}
}

int main() {

	vector&lt;int&gt; vec= {1, 0, 3, 5, 0, 8, 6, 0, 9, 0};

	cout &lt;&lt; quick_select(vec, 0, vec.size() - 1, 5) &lt;&lt; endl;

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2385635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385635</guid><dc:creator><![CDATA[jeff1]]></dc:creator><pubDate>Thu, 27 Feb 2014 19:11:20 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Thu, 27 Feb 2014 19:53:57 GMT]]></title><description><![CDATA[<p>&quot;Funktioniert nicht&quot; ist keine Fehlerbeschreibung.<br />
Dein Algorithmus ist einfach falsch, er tauscht immer die gleichen Elemente und hängt somit in einer Endlosschleife.</p>
<p>Um das Problem zu lösen, einfach <a href="https://www.google.com/search?q=Quicksort%20duplicates" rel="nofollow">Google</a> frage. Gibt genug Sourcecode und Erklärungen zu Quicksort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385643</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Thu, 27 Feb 2014 19:53:57 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Thu, 27 Feb 2014 22:14:52 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>&quot;Funktioniert nicht&quot; ist keine Fehlerbeschreibung.<br />
Dein Algorithmus ist einfach falsch, er tauscht immer die gleichen Elemente und hängt somit in einer Endlosschleife.</p>
</blockquote>
<p>Glaub ich nicht. Hab's nicht ausprobiert, aber ... wieso sollte der immer die selben Elemente tauschen?</p>
<p>Was dagegen problematisch aussieht ist das fehlende Bounds-Checking in den i++/j++ Loops.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385658</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 27 Feb 2014 22:14:52 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Thu, 27 Feb 2014 22:21:29 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Um das Problem zu lösen, einfach <a href="https://www.google.com/search?q=Quicksort%20duplicates" rel="nofollow">Google</a> frage. Gibt genug Sourcecode und Erklärungen zu Quicksort.</p>
</blockquote>
<p>es geht um quickselect, nicht um quicksort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385661</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 27 Feb 2014 22:21:29 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Thu, 27 Feb 2014 22:30:27 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Um das Problem zu lösen, einfach <a href="https://www.google.com/search?q=Quicksort%20duplicates" rel="nofollow">Google</a> frage. Gibt genug Sourcecode und Erklärungen zu Quicksort.</p>
</blockquote>
<p>es geht um quickselect, nicht um quicksort.</p>
</blockquote>
<p>Und?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385663</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 27 Feb 2014 22:30:27 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Thu, 27 Feb 2014 23:06:55 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>&quot;Funktioniert nicht&quot; ist keine Fehlerbeschreibung.<br />
Dein Algorithmus ist einfach falsch, er tauscht immer die gleichen Elemente und hängt somit in einer Endlosschleife.</p>
</blockquote>
<p>Glaub ich nicht. Hab's nicht ausprobiert, aber ... wieso sollte der immer die selben Elemente tauschen?</p>
<p>Was dagegen problematisch aussieht ist das fehlende Bounds-Checking in den i++/j++ Loops.</p>
</blockquote>
<p>Ist aber so. Wenn a[i]=a[j]=pivot vertauscht er beide elemente immer wieder. Und läuft nicht weiter. Die bounds sind natürkich noch dazu problematisch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385666</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Thu, 27 Feb 2014 23:06:55 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Thu, 27 Feb 2014 23:08:13 GMT]]></title><description><![CDATA[<blockquote>
<p>Glaub ich nicht. Hab's nicht ausprobiert, aber ... wieso sollte der immer die selben Elemente tauschen?</p>
</blockquote>
<p>Weil der Algorithmus sich darauf verlässt dass nach dem swap eine Änderung eingetreten ist:</p>
<pre><code>do{
    while (a[i] &lt; pivot) i++; //wenn swap nichts ändert 
    while (a[j] &gt; pivot) j--; //dann brechen die Schleifen sofort ab

    if (i &lt; j)
        swap(a[i], a[j]); //ändert nichts, beim nächste Durchlauf wird keine Varaible geändert und das Programm hängt für alle Ewigkeit
} while (i &lt; j);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2385667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385667</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Thu, 27 Feb 2014 23:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Fri, 28 Feb 2014 00:57:19 GMT]]></title><description><![CDATA[<p>Achjeh ich blindes Huhn!<br />
Ja, da müsste &lt;= bzw. &gt;= stehen.<br />
Huiiiiiiii.</p>
<p>Danke für's Erklären!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385672</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 28 Feb 2014 00:57:19 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Fri, 28 Feb 2014 08:25:18 GMT]]></title><description><![CDATA[<p>sollte so ok sein? muss die funktion noch testen!</p>
<pre><code>int rand_partition(vector&lt;int&gt; &amp;a, int left, int right) {
	int pivotIndex = left + (rand() % (right - left));
	//int m = left + (right - left) / 2; //... to test the algo...no rand at this point 
	int pivot = a[pivotIndex];
	int i = left;
	int j = right;

	do {
		while (i &lt; j &amp;&amp; a[i] &lt;= pivot) i++; // find left element &gt; pivot 
		while (i &lt; j &amp;&amp; a[j] &gt; pivot) j--; // find right element &lt; pivot 

		// if i and j not already overlapped, we can swap 
		if (i &lt; j) {
			swap(a[i], a[j]);
		}
	} while (i &lt; j);

	return i;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2385694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385694</guid><dc:creator><![CDATA[jeff1]]></dc:creator><pubDate>Fri, 28 Feb 2014 08:25:18 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Fri, 28 Feb 2014 15:01:11 GMT]]></title><description><![CDATA[<p>Klar ist es. Das Programm hängt sich nicht mehr auf.<br />
Allerdings funktioniert der Algorithmus immer noch nicht. Aber da der Algorithmus aus dem Anfangspost nauch nicht funktioniert, nicht mal ohne Duplikate, passt das schon. <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="🙂"
    /></p>
<p>Es sei denn das Programm soll gar nicht sortieren, aber dann kannst du das auch deutlich kürzer schreiben. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2385781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385781</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Fri, 28 Feb 2014 15:01:11 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Fri, 28 Feb 2014 15:51:33 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Es sei denn das Programm soll gar nicht sortieren, aber dann kannst du das auch deutlich kürzer schreiben. <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>
</blockquote>
<p>Vielleicht liest Du einfach mal nach was Quick<strong>select</strong> ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385796</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Fri, 28 Feb 2014 15:51:33 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Fri, 28 Feb 2014 17:33:12 GMT]]></title><description><![CDATA[<blockquote>
<p>Vielleicht liest Du einfach mal nach was Quickselect ist?</p>
</blockquote>
<p>Hab ich. Und nun ?<br />
Teilweise sortiert werden muss auch hier werden. Und einfach mal ein &lt;= einbauen ohne zu testen und hoffen dass es geht führt normalweise nicht zum Ziel.</p>
<p>Folgendes Testprogramm:</p>
<pre><code>void quickTest(int start, int n)
{
	vector&lt;int&gt; vec;
	vec.push_back(9);
	vec.push_back(2);
	vec.push_back(3);
	vec.push_back(5);
	vec.push_back(40);
	vec.push_back(1);

	cout &lt;&lt; quick_select(vec, start, 5, n) &lt;&lt; endl; 
}

int main()
{ 
	quickTest(0, 0);
	quickTest(0, 1);

	quickTest(1, 0);
	quickTest(1, 1);

    return 0; 
}
</code></pre>
<p>Mit alten Algorithmus:</p>
<blockquote>
<p>1<br />
2</p>
<p>1<br />
1</p>
</blockquote>
<p>Mit neuem Algorithmus:</p>
<blockquote>
<p>1<br />
2</p>
<p>2<br />
2</p>
</blockquote>
<p>Beides falsch.<br />
Oder wo ist mein Fehler ? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2385802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385802</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Fri, 28 Feb 2014 17:33:12 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Fri, 28 Feb 2014 18:18:19 GMT]]></title><description><![CDATA[<p>Naja der 2. rekursive Abstieg ist noch falsch.<br />
Die Partition selbst müsste OK sein.<br />
Wobei ich nicht verstehe wieso die Bedingung nur in einer der beiden Schleifen geändert wurde.<br />
Ich würd das in beiden ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385813</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 28 Feb 2014 18:18:19 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Fri, 28 Feb 2014 19:06:58 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Naja der 2. rekursive Abstieg ist noch falsch.<br />
Die Partition selbst müsste OK sein.<br />
Wobei ich nicht verstehe wieso die Bedingung nur in einer der beiden Schleifen geändert wurde.<br />
Ich würd das in beiden ändern.</p>
</blockquote>
<p>Stell dir vor, ich packe an beide enden ein element mit pivot-wert. Über die läufst du nun drüber. Danach hast du keine chance mehr das richtig hinzukriegen. Ich denke es ist schon sinnvoll sonzuu partitionieren, dass zum beispiel alles was kleiner oder gleich pivot ist links landet und der rest rechts.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21156">@Darkshadow44</a>: die Empfehlung das mal nachzulesen war nur als Hilfestellung zur Erlangung von Kongruenz zwischen Tonfall und vorhandenem Fachwissen gedacht.</p>
<p>Anders gesagt: wenn jemand sich an quickselect versucht, dann ist eine hilfestellung wie &quot;dein quicksort sortiert nicht richtig, und wenn es das nicht soll könnte ich das auch mit weniger code&quot; schon recht vielsagend, aber halt nicht für den der gefragt hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385823</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Fri, 28 Feb 2014 19:06:58 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Sat, 01 Mar 2014 00:22:18 GMT]]></title><description><![CDATA[<blockquote>
<p>Anders gesagt: wenn jemand sich an quickselect versucht, dann ist eine hilfestellung wie &quot;dein quicksort sortiert nicht richtig, und wenn es das nicht soll</p>
<p>könnte ich das auch mit weniger code&quot; schon recht vielsagend, aber halt nicht für den der gefragt hat.</p>
</blockquote>
<p>Stimmt schon, das war nicht richtig, tut mir leid. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Ich kann den Algorithmus ja selber nicht gut...</p>
<p>Ich hätte jetzt folgendes gemacht:</p>
<pre><code>int rand_partition(vector&lt;int&gt; &amp;a, int left, int right) { 
    int pivotIndex = left + (rand() % (right - left)); 
    //int m = left + (right - left) / 2; //... to test the algo...no rand at this point 
    int pivot = a[pivotIndex]; 
    int i = left; 
    int j = right-1; 

	swap(a[pivotIndex], a[right]);

    do { 
        while (i &lt; j  &amp;&amp; a[i] &lt;= pivot)
			i++; // find left element &gt; pivot 
        while (i &lt; j &amp;&amp; a[j] &gt; pivot)
			j--; // find right element &lt; pivot 

        // if i and j not already overlapped, we can swap 
        if (i &lt; j) { 
            swap(a[i], a[j]); 
        } 
    } while (i &lt; j); 

	if(a[i]&gt;pivot)
	{
		swap(a[i], a[right]);
		return i;
	}

    return i+1;
}
</code></pre>
<p>Das funktioniert soweit, ist aber nicht wirklich schön...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385860</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Sat, 01 Mar 2014 00:22:18 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Quickselect Algorithmus on Sat, 01 Mar 2014 01:42:15 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Naja der 2. rekursive Abstieg ist noch falsch.<br />
Die Partition selbst müsste OK sein.<br />
Wobei ich nicht verstehe wieso die Bedingung nur in einer der beiden Schleifen geändert wurde.<br />
Ich würd das in beiden ändern.</p>
</blockquote>
<p>Stell dir vor, ich packe an beide enden ein element mit pivot-wert. Über die läufst du nun drüber. Danach hast du keine chance mehr das richtig hinzukriegen. Ich denke es ist schon sinnvoll sonzuu partitionieren, dass zum beispiel alles was kleiner oder gleich pivot ist links landet und der rest rechts.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /><br />
Danke.</p>
<p>Also im Moment hab ich echt nen Lauf Quatsch zu schreiben. So viel Mist wie in den letzten 3 Tage schreib ich sonst nicht in 3 Wochen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2385870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2385870</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 01 Mar 2014 01:42:15 GMT</pubDate></item></channel></rss>