<?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[Quicksort-Problem]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Ich will einen Quicksort-Algo. programmieren, der mir auf Listen funktioniert. Ich hab dann mal so angefangen:</p>
<pre><code class="language-cpp">void Swap(element *a, element *b)
{
	element *temp;

	temp-&gt;val = b-&gt;val;
	b-&gt;val = a-&gt;val;
	a-&gt;val = temp-&gt;val;
}

void list::Quicksort(element *f, element *l)
{
	element *part;	//Was ist das?

	if(f &lt; l)
	{
		PreparePartition(f, l, part);
		Quicksort(f, part-&gt;prev);
		Quicksort(part-&gt;next, l);
	}
}

void list::PreparePartition(element *f, element *l, element *p)
{
	int pivot = f-&gt;val;
	p = p-&gt;prev;

	while(f-&gt;next != NULL)
	{
		if(f-&gt;val &lt;= pivot)
		{
			p = p-&gt;prev;
			Swap(f, p);
		}

		f = f-&gt;next;
	}

	//Pivot-Element an die richtige Stelle tauschen
	Swap(f, p);
}
</code></pre>
<p>Das ganze hat dann noch diese Header-Dateien:</p>
<pre><code class="language-cpp">#ifndef LIST__H
#define LIST__H
#include&quot;element.h&quot;

class list
{
private:
	element *head;	//Zeiger auf den Anfang
	element *tail;	//Zeiger auf das Ende

	void DeleteList_private(element *first);

public:
	list();
	~list();

	void Append(int value);	//Fügt einen Wert hinzu
	void DeleteList();	//Löscht die Liste
	void DeleteValue(int value);	//Löscht einen Wert in der Liste
	void Print();	//Gibt Liste aus
	element* GetFirstElement();
	element* GetLastElement();

	void Quicksort(element *f, element *l);
	void PreparePartition(element *f, element *l, element *p);
	void Swap(element *a, element *b);
};

#endif
</code></pre>
<pre><code class="language-cpp">#ifndef ELEMENT__H
#define ELEMENT__H

class element
{
public:
	int val;
	element *next;
	element *prev;
};

#endif
</code></pre>
<p>Wenn ich das nun von der main aus aufrufe, bekomm ich zwei &quot;linker-Fehler&quot; und zwei warnungen, dass *temp und *part nicht initialisiert sind. Woran liegt das?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303091/quicksort-problem</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 13:51:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303091.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 May 2012 10:22:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 10:23:32 GMT]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Ich will einen Quicksort-Algo. programmieren, der mir auf Listen funktioniert. Ich hab dann mal so angefangen:</p>
<pre><code class="language-cpp">void Swap(element *a, element *b)
{
	element *temp;

	temp-&gt;val = b-&gt;val;
	b-&gt;val = a-&gt;val;
	a-&gt;val = temp-&gt;val;
}

void list::Quicksort(element *f, element *l)
{
	element *part;	//Was ist das?

	if(f &lt; l)
	{
		PreparePartition(f, l, part);
		Quicksort(f, part-&gt;prev);
		Quicksort(part-&gt;next, l);
	}
}

void list::PreparePartition(element *f, element *l, element *p)
{
	int pivot = f-&gt;val;
	p = p-&gt;prev;

	while(f-&gt;next != NULL)
	{
		if(f-&gt;val &lt;= pivot)
		{
			p = p-&gt;prev;
			Swap(f, p);
		}

		f = f-&gt;next;
	}

	//Pivot-Element an die richtige Stelle tauschen
	Swap(f, p);
}
</code></pre>
<p>Das ganze hat dann noch diese Header-Dateien:</p>
<pre><code class="language-cpp">#ifndef LIST__H
#define LIST__H
#include&quot;element.h&quot;

class list
{
private:
	element *head;	//Zeiger auf den Anfang
	element *tail;	//Zeiger auf das Ende

	void DeleteList_private(element *first);

public:
	list();
	~list();

	void Append(int value);	//Fügt einen Wert hinzu
	void DeleteList();	//Löscht die Liste
	void DeleteValue(int value);	//Löscht einen Wert in der Liste
	void Print();	//Gibt Liste aus
	element* GetFirstElement();
	element* GetLastElement();

	void Quicksort(element *f, element *l);
	void PreparePartition(element *f, element *l, element *p);
	void Swap(element *a, element *b);
};

#endif
</code></pre>
<pre><code class="language-cpp">#ifndef ELEMENT__H
#define ELEMENT__H

class element
{
public:
	int val;
	element *next;
	element *prev;
};

#endif
</code></pre>
<p>Wenn ich das nun von der main aus aufrufe, bekomm ich zwei &quot;linker-Fehler&quot; und zwei warnungen, dass *temp und *part nicht initialisiert sind. Woran liegt das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208471</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Sat, 05 May 2012 10:23:32 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 10:33:53 GMT]]></title><description><![CDATA[<p>Das Problem mit den Warnungen liegt hier:</p>
<pre><code class="language-cpp">void Swap(element *a, element *b) 
{ 
    element *temp; // Uninitialisierter Zeiger

    temp-&gt;val = b-&gt;val; // Hier knallts deswegen
    b-&gt;val = a-&gt;val; 
    a-&gt;val = temp-&gt;val; 
}
</code></pre>
<p>und dann hast du noch einen solchen in Zeile 12. Die sollte man halt irgendwie initialisieren.</p>
<p>Was spuckt denn der Linker fuer einen Fehler aus? Wenn das dein ganzer Code ist, dann liegt es vielleicht daran, dass du einen Funktionen deklariert aber noch nicht definiert hast.</p>
<p>* Edit<br />
Btw: Quicksort auf Listen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208474</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sat, 05 May 2012 10:33:53 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 10:32:38 GMT]]></title><description><![CDATA[<p>Quicksort auf verketteten Listen ergibt keinen Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208475</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 05 May 2012 10:32:38 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 10:39:15 GMT]]></title><description><![CDATA[<p>Auweia ... da ist eine ganze Menge falsch.</p>
<p>Das <code>if (l&lt;r)</code> soll doch sicher <code>if (l!=r)</code> heißen; denn die Adressen der Knotenobjekte einer Liste sind nicht zwangsweise aufsteigend!</p>
<p>Part in QuickSort wird nie gesetzt, aber verwendet. Auch nicht durch den PreparePartition-Aufruf. Vielleicht möchtest Du ja den dritten Parameter per Referenz entgegen nehmen, also <code>element*&amp;p</code> .</p>
<blockquote>
<p>... bekomm ich zwei &quot;linker-Fehler&quot; und zwei warnungen, dass *temp und *part nicht initialisiert sind. Woran liegt das?</p>
</blockquote>
<p>Bzgl Linker-Fehler: Wahrscheinlich hast du die ODR (one definition rule) verletzt.<br />
Bzgl Warnungen: Uninitialisierte Variablen zu benutzen ist typischerweise ein Fehler. Deswegen ist der Compiler so nett, Dich davor zu warnen.</p>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Quicksort auf verketteten Listen ergibt keinen Sinn.</p>
</blockquote>
<p>Ich würde da auch lieber eine MergeSort Implementierung empfehlen, wo Elemente nie umkopiert, nur die Knoten neu verlinkt werden. Aber prinzipiell ist das mit dem QuickSort auch machbar mit 'nem average case von O(n*log(n)), falls ich mich gerade nicht völlig vertue. Zum Partitionieren sind nur BiDi-Iteratoren erforderlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208476</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 05 May 2012 10:39:15 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 11:35:38 GMT]]></title><description><![CDATA[<p>Danke für eure Hilfe!</p>
<p>Dass ich einen Quicksort nehmen soll, liegt in der Natur der Aufgabe und dafür kann ich nichts.</p>
<p>Hier die genauen Compiler-Fehler/Warnungen:</p>
<p>Fehler 2 error LNK1120: 1 nicht aufgelöste externe Verweise. C:\Users\ggg\Desktop\U5Aufgabe4_1\Debug\U5Aufgabe4_1.exe 1</p>
<p>Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol &quot;&quot;public: void __thiscall list::Swap(class element *,class element *)&quot; (?Swap@list@@QAEXPAVelement@@0@Z)&quot; in Funktion &quot;&quot;public: void __thiscall list::PreparePartition(class element *,class element *,class element *)&quot; (?PreparePartition@list@@QAEXPAVelement@@00@Z)&quot;. C:\Users\ggg\Desktop\U5Aufgabe4_1\U5Aufgabe4_1\list.obj</p>
<p>Edit: Mit was soll ich denn die zwei uninitialisierten pointer initialisieren?<br />
Edit2: Nachdem ich jetzt die Referenz zum dirtten Aufruf in der PreparePartition-Methode hinzugefügt habe, sind die zwei Warnungen weg. Das Linker Problem besteht nach wie vor!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208489</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Sat, 05 May 2012 11:35:38 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 11:52:23 GMT]]></title><description><![CDATA[<p>auweia! Verstehst du denn auch, was du mit der Referenz gemacht hast?</p>
<p>Und wenn die Linkerfehler noch bestehen, hast Du noch immer ODR-Verletzungen im Code. Schau mal in Dein C++ Buch nach der ODR (one definition rule).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208497</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 05 May 2012 11:52:23 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 11:55:46 GMT]]></title><description><![CDATA[<p>Der Linkerfehler rührt wohl daher, daß dir in der ersten Zeile ein <code>list::</code> fehlt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208499</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Sat, 05 May 2012 11:55:46 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 14:13:02 GMT]]></title><description><![CDATA[<p>Tatsächlich, der linker-Fehler kommt in der Tat von dem vergessenen list::. Danke!</p>
<p>Also hab ich wohl die ODR-Regel nicht verletzt.</p>
<p>Was ich mit *&amp; gemacht habe, verstehe ich in der Tat nicht so genau. Ich kenne den &amp;-Operator bei Zeigern als einen Operator, der mir die Adresse von einem Zeiger ausgibt.<br />
Ich hab hier jetzt in meinem C++Buch auch nachgelesen, aber über die Kombination von * mit &amp; in einem Funktionsaufruf leider nichts gefunden...</p>
<p>Nachdem der linker Fehler jetzt weg ist, bekomm ich eine exception, wegen der nicht initialisierten *temp Variable. Sie mit einem Wert für val zu initialisieren hilft auch nichts</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208538</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Sat, 05 May 2012 14:13:02 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 14:30:02 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Das Problem mit den Warnungen liegt hier:</p>
<pre><code class="language-cpp">void Swap(element *a, element *b) 
{ 
    element *temp; // Uninitialisierter Zeiger

    temp-&gt;val = b-&gt;val; // Hier knallts deswegen
    b-&gt;val = a-&gt;val; 
    a-&gt;val = temp-&gt;val; 
}
</code></pre>
<p>und dann hast du noch einen solchen in Zeile 12. Die sollte man halt irgendwie initialisieren.</p>
</blockquote>
<p>Die Warnungen provozieren dann im weiteren Verlauf des Quicksorts auch den Absturz. Ich hab nun versucht, die pointer so zu initialisieren, was aber auch nicht geht:</p>
<pre><code class="language-cpp">void list::Swap(element* a, element* b)
{
	element* temp;

	temp-&gt;next = NULL;
	temp-&gt;prev = NULL;
	temp-&gt;val = 0;

	temp-&gt;val = b-&gt;val;
	b-&gt;val = a-&gt;val;
	a-&gt;val = temp-&gt;val;
}
</code></pre>
<p>Wie macht man das jetzt richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208543</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Sat, 05 May 2012 14:30:02 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 14:36:19 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Quicksort auf verketteten Listen ergibt keinen Sinn.</p>
</blockquote>
<p>Warum? Oder besser: seit wann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208545</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Sat, 05 May 2012 14:36:19 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 14:37:32 GMT]]></title><description><![CDATA[<p>vip@r schrieb:</p>
<blockquote>
<p>Also hab ich wohl die ODR-Regel nicht verletzt.</p>
</blockquote>
<p>Naja, dir fehlte eine Definition von etwas, was Du nutzen wolltest.</p>
<p>vip@r schrieb:</p>
<blockquote>
<p>Was ich mit *&amp; gemacht habe, verstehe ich in der Tat nicht so genau. Ich kenne den &amp;-Operator bei Zeigern als einen Operator, der mir die Adresse von einem Zeiger ausgibt.<br />
Ich hab hier jetzt in meinem C++Buch auch nachgelesen, aber über die Kombination von * mit &amp; in einem Funktionsaufruf leider nichts gefunden...</p>
</blockquote>
<p>Da ist auch nichts besonderes an der Kombination.<br />
* deklariert einen Zeiger und<br />
&amp; deklariert eine Referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208547</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 05 May 2012 14:37:32 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 14:41:03 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Naja, dir fehlte eine Definition von etwas, was Du nutzen wolltest.</p>
</blockquote>
<p>Was wollte ich denn nutzen? So wie ich das von icarus2 verstanden habe, knallts in meinem Programm weil ich eben diese zwei Zeiger nicht initialisiert habe. Wie initialisiere ich denn nun diese Zeiger? So wie ich es versucht habe, funktioniert es jedenfalls nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208548</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Sat, 05 May 2012 14:41:03 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 15:09:28 GMT]]></title><description><![CDATA[<p>Schreib einfach</p>
<pre><code class="language-cpp">element temp;

temp.val=...
</code></pre>
<p>Dann liegt das temporäre element auf dem stack und zumindest der teil passt dann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208560</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Sat, 05 May 2012 15:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Sat, 05 May 2012 18:18:42 GMT]]></title><description><![CDATA[<p>Gut, da hätt ich auch drauf kommen können...</p>
<p>Wie mach ich das dann weiter beim part? Ich hab das hier auch mal als element part; deklariert, aber dann passt der rekursive Aufruf von Quicksort() nicht mehr, da ich von der main aus mit einem element* aufrufe, beim rekursiven Aufruf aber mit einem part.prev...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2208604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2208604</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Sat, 05 May 2012 18:18:42 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Mon, 07 May 2012 10:11:17 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Quicksort auf verketteten Listen ergibt keinen Sinn.</p>
</blockquote>
<p>Warum? Oder besser: seit wann?</p>
</blockquote>
<p>Warum:<br />
Weil Quicksort wahlfreien Zugriff auf Elemente benutzt, z.B. bei der Bestimmung des Pivot Elementes und der Partitionierung. Man kann das natürlich auch für einfach und doppelt verkettete Liste implementieren, aber dann wird´s erbärmlich langsam. Für verkettete Listen ist Mergesort die bessere Alternative.</p>
<p>Seit wann:<br />
Schon immer, prinzipbedingt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209017</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 07 May 2012 10:11:17 GMT</pubDate></item><item><title><![CDATA[Reply to Quicksort-Problem on Mon, 07 May 2012 13:36:10 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Jester schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Quicksort auf verketteten Listen ergibt keinen Sinn.</p>
</blockquote>
<p>Warum? Oder besser: seit wann?</p>
</blockquote>
<p>Warum:<br />
Weil Quicksort wahlfreien Zugriff auf Elemente benutzt, z.B. bei der Bestimmung des Pivot Elementes und der Partitionierung.</p>
</blockquote>
<p>Bei der Partitionierung jawohl schonmal nicht, man läuft von beiden Enden los und vertauscht die Elemente, wenn das linke größer als das Pivot ist und das rechte größer. Wozu braucht man da nen wahlfreien Zugriff? Das Pivot-Element ist ne andere Sache, aber man kann ja wie hier vorgeschlagen immer das erste nehmen, oder sich eben beim vorherigen Partitionierungsschritt schon das Pivot-Element mit rausfriemeln ohne mehr Laufzeit zu brauchen.</p>
<p>Magst Du's nochmal versuchen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209088</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Mon, 07 May 2012 13:36:10 GMT</pubDate></item></channel></rss>