<?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 sehr langsam]]></title><description><![CDATA[<p>Moin,</p>
<p>ich arbeite grade an einem kleinen Programm, in dem eine verkettete Liste per Mergesort sortiert werden soll. Die Liste ist folgendermaßen aufgebaut</p>
<pre><code class="language-cpp">struct edge
{
	int cost;
	edge *next;
};
</code></pre>
<p>und hat im aktuellen Stadium etwa 100.000 Einträge. Das dürften später allerdings deutlich mehr werden (ich denke mal bis 10 Mio).</p>
<p>Um diese nach &quot;cost&quot; zu sortieren habe ich mich für mergesort entschieden, welches für sehr große verkettete Listen anscheinend das schnellste sein soll.</p>
<p>Hier ist mein Algorithmus (geschrieben nach <a href="http://de.wikipedia.org/wiki/Mergesort#Implementierung" rel="nofollow">http://de.wikipedia.org/wiki/Mergesort#Implementierung</a>)</p>
<pre><code class="language-cpp">edge* merge(edge *l1, edge *l2)
{
	edge *tmp = NULL;
	edge *start = NULL;
	edge *end = NULL;
	while (l1 &amp;&amp; l2)
	{
		if (l1-&gt;cost &lt;= l2-&gt;cost){
			tmp = new edge;
			tmp-&gt;cost = l1-&gt;cost;
			tmp-&gt;next = NULL;
			if (start == NULL) start = tmp;
			if (end != NULL) end-&gt;next = tmp;
			end = tmp;
			l1 = l1-&gt;next;
		} else {
			tmp = new edge;
			tmp-&gt;cost = l2-&gt;cost;
			tmp-&gt;next = NULL;
			if (start == NULL) start = tmp;
			if (end != NULL) end-&gt;next = tmp;
			end = tmp;
			l2 = l2-&gt;next;
		}
	}
	while (l1){
		tmp = new edge;
		tmp-&gt;cost = l1-&gt;cost;
		tmp-&gt;next = NULL;
		if (start == NULL) start = tmp;
		if (end != NULL) end-&gt;next = tmp;
		end = tmp;
		l1 = l1-&gt;next;
	}
	while (l2){
		tmp = new edge;
		tmp-&gt;cost = l2-&gt;cost;
		tmp-&gt;next = NULL;
		if (start == NULL) start = tmp;
		if (end != NULL) end-&gt;next = tmp;
		end = tmp;
		l2 = l2-&gt;next;
	}

	return start;
}

edge* mergesort(edge *liste)
{
	if (liste-&gt;next){
		edge *tmp=NULL;
		edge *l1=NULL;
		edge *l2=NULL;
		int i=0;
		while (liste){
			tmp = new edge;
			tmp-&gt;cost = liste-&gt;cost;

			if (i%2==0){
				tmp-&gt;next = l1;
				l1 = tmp;
			} else {
				tmp-&gt;next = l2;
				l2 = tmp;
			}

			liste = liste-&gt;next;
			i++;
		}
		return merge(mergesort(l1),mergesort(l2));
	}
	else return liste;
}
</code></pre>
<p>Der Code in Zeile 59-65 dient dazu, die Liste in zwei Teile aufzuteilen. Anstatt sie in der Mitte aufzutrennen, schiebe ich die Einträge abwechselnd in Liste 1 und 2. Das ist, denke ich, schneller als die Mitte zu suchen.</p>
<p>Auf jeden Fall benötigt der Aufruf der mergesort() Funktion für eine Liste mit 100.000 Einträgen über 5 Sekunden. Bei 400.000 stürzt das Programm sogar mit einer leider nicht lesbaren Fehlermeldung der MS Visual C++ Debug Library ab.</p>
<p>Habe ich hier irgendeinen Denkfehler? Diese Laufzeit ist doch jenseits von Gut und Böse, vom Programmabsturz mal ganz abgesehen.</p>
<p>Ich bin für jede Hilfe dankbar</p>
<p>[edit] achso ja, der Code funktioniert, also die Liste wird durch die Funktion ordentlich sortiert</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268802/mergesort-sehr-langsam</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 23:14:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268802.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Jun 2010 16:25:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 16:28:22 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>ich arbeite grade an einem kleinen Programm, in dem eine verkettete Liste per Mergesort sortiert werden soll. Die Liste ist folgendermaßen aufgebaut</p>
<pre><code class="language-cpp">struct edge
{
	int cost;
	edge *next;
};
</code></pre>
<p>und hat im aktuellen Stadium etwa 100.000 Einträge. Das dürften später allerdings deutlich mehr werden (ich denke mal bis 10 Mio).</p>
<p>Um diese nach &quot;cost&quot; zu sortieren habe ich mich für mergesort entschieden, welches für sehr große verkettete Listen anscheinend das schnellste sein soll.</p>
<p>Hier ist mein Algorithmus (geschrieben nach <a href="http://de.wikipedia.org/wiki/Mergesort#Implementierung" rel="nofollow">http://de.wikipedia.org/wiki/Mergesort#Implementierung</a>)</p>
<pre><code class="language-cpp">edge* merge(edge *l1, edge *l2)
{
	edge *tmp = NULL;
	edge *start = NULL;
	edge *end = NULL;
	while (l1 &amp;&amp; l2)
	{
		if (l1-&gt;cost &lt;= l2-&gt;cost){
			tmp = new edge;
			tmp-&gt;cost = l1-&gt;cost;
			tmp-&gt;next = NULL;
			if (start == NULL) start = tmp;
			if (end != NULL) end-&gt;next = tmp;
			end = tmp;
			l1 = l1-&gt;next;
		} else {
			tmp = new edge;
			tmp-&gt;cost = l2-&gt;cost;
			tmp-&gt;next = NULL;
			if (start == NULL) start = tmp;
			if (end != NULL) end-&gt;next = tmp;
			end = tmp;
			l2 = l2-&gt;next;
		}
	}
	while (l1){
		tmp = new edge;
		tmp-&gt;cost = l1-&gt;cost;
		tmp-&gt;next = NULL;
		if (start == NULL) start = tmp;
		if (end != NULL) end-&gt;next = tmp;
		end = tmp;
		l1 = l1-&gt;next;
	}
	while (l2){
		tmp = new edge;
		tmp-&gt;cost = l2-&gt;cost;
		tmp-&gt;next = NULL;
		if (start == NULL) start = tmp;
		if (end != NULL) end-&gt;next = tmp;
		end = tmp;
		l2 = l2-&gt;next;
	}

	return start;
}

edge* mergesort(edge *liste)
{
	if (liste-&gt;next){
		edge *tmp=NULL;
		edge *l1=NULL;
		edge *l2=NULL;
		int i=0;
		while (liste){
			tmp = new edge;
			tmp-&gt;cost = liste-&gt;cost;

			if (i%2==0){
				tmp-&gt;next = l1;
				l1 = tmp;
			} else {
				tmp-&gt;next = l2;
				l2 = tmp;
			}

			liste = liste-&gt;next;
			i++;
		}
		return merge(mergesort(l1),mergesort(l2));
	}
	else return liste;
}
</code></pre>
<p>Der Code in Zeile 59-65 dient dazu, die Liste in zwei Teile aufzuteilen. Anstatt sie in der Mitte aufzutrennen, schiebe ich die Einträge abwechselnd in Liste 1 und 2. Das ist, denke ich, schneller als die Mitte zu suchen.</p>
<p>Auf jeden Fall benötigt der Aufruf der mergesort() Funktion für eine Liste mit 100.000 Einträgen über 5 Sekunden. Bei 400.000 stürzt das Programm sogar mit einer leider nicht lesbaren Fehlermeldung der MS Visual C++ Debug Library ab.</p>
<p>Habe ich hier irgendeinen Denkfehler? Diese Laufzeit ist doch jenseits von Gut und Böse, vom Programmabsturz mal ganz abgesehen.</p>
<p>Ich bin für jede Hilfe dankbar</p>
<p>[edit] achso ja, der Code funktioniert, also die Liste wird durch die Funktion ordentlich sortiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912281</guid><dc:creator><![CDATA[Godemit]]></dc:creator><pubDate>Mon, 14 Jun 2010 16:28:22 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 16:28:51 GMT]]></title><description><![CDATA[<p>Wieso verwendest du nicht std::list und das entsprechende sort?</p>
<blockquote>
<p>Diese Laufzeit ist doch jenseits von Gut und Böse</p>
</blockquote>
<p>Debug/Release?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912284</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 14 Jun 2010 16:28:51 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 16:30:50 GMT]]></title><description><![CDATA[<p>Kompilier mal auf Release. Auch wenn das hier denke ich nicht soo wahnsinnig viel ausmacht (weil ich keine STL sehe).</p>
<p>So, wie ich das auf die schnelle sehe gehst du mit dem Algorithmus bis ganz nach unten. Das solltest du nicht machen, weil du sonst sehr viele kleine Mergeschritte hast, was nicht sehr gut ist. Sortier irgendwo bei einer grösse von 5-10 Elementen mal mit einem O(n^2) Algorithmus, wie z.B Introsort. Das sollte einiges ausmachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912287</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 14 Jun 2010 16:30:50 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 17:32:24 GMT]]></title><description><![CDATA[<p>introsort ist aber n*log n.. ^^<br />
ich würd auch lieber nen einfacheren nehmen - bei 5-10 elementen sollte es so gar ein bubblesort noch tun^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912323</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 14 Jun 2010 17:32:24 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 17:40:06 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>introsort ist aber n*log n.. ^^<br />
ich würd auch lieber nen einfacheren nehmen - bei 5-10 elementen sollte es so gar ein bubblesort noch tun^^</p>
</blockquote>
<p>Ach Mist. Ich meinte natürlich Insertionsort.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Warum müssen die auch so ähnlich klingen. <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>
<p>Hmm. Imo kann man Introsort nicht so einfach mit nlog n bewerten.. Wenn es dumm läuft kann man wahrscheinlich (je nach Kritierum für das wechseln) schon ein Beispiel bauen, welches n^2 Worst Case hat.<br />
Ist natürlich für praktsiche Anwendungen sicher eines der besten Verfahren, aber vom theoretischen Standpunkt aus ist diese Laufzeit bestimmt nicht so einfach zu beweisen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912330</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 14 Jun 2010 17:40:06 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 18:01:44 GMT]]></title><description><![CDATA[<p>Godemit schrieb:</p>
<blockquote>
<p>Anstatt sie in der Mitte aufzutrennen, schiebe ich die Einträge abwechselnd in Liste 1 und 2. Das ist, denke ich, schneller als die Mitte zu suchen.</p>
</blockquote>
<p>Jo, das ist das naheliegenste. Das macht std::list&lt;&gt;::sort wahrscheinlich genauso.</p>
<p>Godemit schrieb:</p>
<blockquote>
<p>Auf jeden Fall benötigt der Aufruf der mergesort() Funktion für eine Liste mit 100.000 Einträgen über 5 Sekunden. Bei 400.000 stürzt das Programm sogar mit einer leider nicht lesbaren Fehlermeldung der MS Visual C++ Debug Library ab.</p>
</blockquote>
<p>Wie sortierst Du denn? Da sind ja 'ne ganze Menge <code>new</code> s drin. Das geht auch ohne, als nur mit Zeiger umbiegen...</p>
<p>Es ist noch gar nicht so lange her, wo ich nen MergeSort (zur Übung, zum Spass) für eine Liste gebaut habe. Ich hatte es in etwa so gemacht:</p>
<pre><code class="language-cpp">/// moves every 2nd element from list1 to list2
void split(node*&amp; list1, node*&amp; list2);

/// merges both lists and stores the result in list1, list2 will be empty
void merge(node*&amp; list1, node*&amp; list2);

void mergesort(node*&amp; list) {
  node* temp = 0;
  split(list,temp);
  if (temp==0) return; // only 0 or 1 node(s) in list
  mergesort(list);
  mergesort(temp);
  merge(list,temp);
  assert(temp==0);
}
</code></pre>
<p><code>split</code> und <code>merge</code> waren auch nicht sooo kompliziert. Aber das krieg ich jetzt wahrscheinlich nicht fehlerfrei runtergetippt. <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="🙂"
    /> Jedenfalls braucht man hier kein <code>new</code> .</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912350</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 14 Jun 2010 18:01:44 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 18:20:29 GMT]]></title><description><![CDATA[<p>Hallo Godemit,</p>
<p>Ich verstehe leider nicht auf die schnelle was der code machen soll,</p>
<ol>
<li></li>
</ol>
<p>was mir auffällt, ist daß viele temporäre objekte mit new angelegt werden<br />
aber nicht wieder frei gegeben werden.<br />
Ich kann mir vorstellen, daß genau das zu dieser schlechten Performance führt.</p>
<p>Kannst du nicht sogar ganz auf new verzichten und den Stack verwenden ?</p>
<p>2. (i%2==0) kann man schneller als (i%2) oder noch schneller als (i&amp;0x01) ausdrücken.<br />
Macht aber nicht dein Problem aus.</p>
<p>Gruß Frank</p>
<p>edit hat den Adressat korrigiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912353</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 14 Jun 2010 18:20:29 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 18:10:43 GMT]]></title><description><![CDATA[<p>Frank Erdorf schrieb:</p>
<blockquote>
<p>Hallo drakon,</p>
<p>Ich verstehe leider nicht auf die schnelle was der code machen soll,</p>
<ol>
<li></li>
</ol>
<p>was mir auffällt, ist daß viele temporäre objekte mit new angelegt werden<br />
aber nicht wieder frei gegeben werden.<br />
Ich kann mir vorstellen, daß genau das zu dieser schlechten Performance führt.</p>
<p>Kannst du nicht sogar ganz auf new verzichten und den Stack verwenden ?</p>
<p>2. (i%2==0) kann man schneller als (i%2) oder noch schneller als (i&amp;0x01) ausdrücken.<br />
Macht aber nicht dein Problem aus.</p>
<p>Gruß Frank</p>
<p>Gruß Frank</p>
</blockquote>
<p>Warum ich?!</p>
<p>1. Nein hat keinen Einfluss auf Performance. Ausser, dass ev. der RAM gefüllt wird.</p>
<p>2. Solche Sachen kommen halt auch sehr auf den Compiler drauf an und können daher nur sehr spezifsch entschieden werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912358</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 14 Jun 2010 18:10:43 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 18:15:53 GMT]]></title><description><![CDATA[<p>1. naja, doch schon - du könntest, falls du die news wirklich brauchst/willst höchstens placement new nutzen, aber im vorraus wirds ein wenig schwer, zu wissen, wie viele knoten du brauchst - und spätestens wenn du dann iwas mit allokatoren bauen möchtest, wirst du nicht drum rum kommen, alles wieder neu zu machen...</p>
<p>2. ich kenn keinen compiler, der im release-mode nicht i%2, i%2==0 und i&amp;1 in äquivalenten maschinencode umsetzt</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912362</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 14 Jun 2010 18:15:53 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 18:26:52 GMT]]></title><description><![CDATA[<p>Frank Erdorf schrieb:</p>
<blockquote>
<p>Kannst du nicht sogar ganz auf new verzichten und den Stack verwenden?</p>
</blockquote>
<p>Man muss überhaupt gar keine node-Objekte irgendwo neu anlegen. Einfach nur Zeiger &quot;verbiegen&quot;. Mehr nicht.</p>
<p>Frank Erdorf schrieb:</p>
<blockquote>
<p>2. (i%2==0) kann man schneller als (i%2) oder noch schneller als (i&amp;0x01) ausdrücken.</p>
</blockquote>
<p>Ich denke nicht, dass das bei einem modernen Compiler einen Unterschied macht. Das ==0 sollte sofort wegoptimiert werden und %2 sofort durch &amp;1 ersetzt, falls äquivalent. Diese Äquivalenz gilt aber nur im Zweierkomplement. :p</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912370</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 14 Jun 2010 18:26:52 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 18:29:40 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Frank Erdorf schrieb:</p>
<blockquote>
<p>2. (i%2==0) kann man schneller als (i%2) oder noch schneller als (i&amp;0x01) ausdrücken.</p>
</blockquote>
<p>Ich denke nicht, dass das bei einem modernen Compiler einen Unterschied macht. Das ==0 sollte sofort wegoptimiert werden und %2 sofort durch &amp;1 ersetzt, falls äquivalent. Diese Äquivalenz gilt aber nur im Zweierkomplement. :p</p>
</blockquote>
<p>Upps... Jetzt hast Du mich reingelegt. <code>i%2==0</code> und <code>i%2</code> sind natürlich <em>nicht</em> äquivalent. Ich schreibe auch lieber <code>i%2==0</code> als <code>!(i%2)</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912371</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 14 Jun 2010 18:29:40 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Mon, 14 Jun 2010 19:19:37 GMT]]></title><description><![CDATA[<p>Hier hat sich mal jemand die Mühe gemacht das in-place (d.h. nur mit konstanten zusätzlichem Speicherplatz) zu implementieren.</p>
<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-255964.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-255964.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912402</guid><dc:creator><![CDATA[mazal]]></dc:creator><pubDate>Mon, 14 Jun 2010 19:19:37 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Tue, 15 Jun 2010 13:04:28 GMT]]></title><description><![CDATA[<p>ui, danke für die vielen Antworten.</p>
<p>Zwischenstatus:<br />
ich hatte tatsächlich auf Debug kompiliert, bei Release ist das Sortieren gut 3x so schnell (1,7 statt 5 sek)<br />
ich hab die new-Anweisung nun komplett raus und biege nur noch die Pointer um (530ms)</p>
<p>Hier der Code:</p>
<pre><code class="language-cpp">struct edge
{
	int cost;
	edge *prev;
	edge *next;
};

edge* merge(edge *l1, edge *l2)
{
	edge *tmp = NULL;
	edge *start = NULL;
	while (l1 &amp;&amp; l2)
	{
		if (l1-&gt;cost &lt;= l2-&gt;cost){
			if (start==NULL) start = l1;
			else tmp-&gt;next = l1;
			l1-&gt;prev = tmp;
			tmp = l1;
			l1 = l1-&gt;next;
		} else {
			if (start==NULL) start = l2;
			else tmp-&gt;next = l2;
			l2-&gt;prev = tmp;
			tmp = l2;
			l2 = l2-&gt;next;
		}
	}
	while (l1){
		if (start==NULL) start = l1;
		else tmp-&gt;next = l1;
		l1-&gt;prev = tmp;
		tmp = l1;
		l1 = l1-&gt;next;
	}
	while (l2){
		if (start==NULL) start = l2;
		else tmp-&gt;next = l2;
		l2-&gt;prev = tmp;
		tmp = l2;
		l2 = l2-&gt;next;
	}
	return start;
}

edge* mergesort(edge *liste)
{
	if (liste-&gt;next){
		edge *tmp1 = NULL;
		edge *tmp2 = NULL;
		edge *l1 = NULL;
		edge *l2 = NULL;
		l1 = liste;
		l2 = liste-&gt;next;
		tmp2 = liste;
		liste = liste-&gt;next;

		while (liste){
			tmp1 = tmp2;

			tmp1-&gt;next = liste-&gt;next;
			if (liste-&gt;next) liste-&gt;next-&gt;prev = tmp1;

			tmp2 = liste;
			liste = liste-&gt;next;
		}
		l2-&gt;prev = NULL;
		return merge(mergesort(l1),mergesort(l2));
	}
	else return liste;
}
</code></pre>
<p>530ms ist schonmal eine sehr gute Steigerung gegenüber den 5000ms vorher, allerdings immernoch weit von dem entfernt, was ich erwarte (es sollte eigentlich etwas um die 10-20ms dauern).</p>
<p>die Idee, bei 10 verbleibenden Listeneinträgen auf ein O(n²)-Verfahren zu wechseln halte ich nur für bedingt sinnvoll. Werde ich aber vielleicht noch ausprobieren, wenn keinem mehr was einfällt.</p>
<p>Ansonsten schnupper ich mal in std::list rein. Das kannte ich garnicht <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>Gruß<br />
Godemit</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912748</guid><dc:creator><![CDATA[Godemit]]></dc:creator><pubDate>Tue, 15 Jun 2010 13:04:28 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Tue, 15 Jun 2010 14:48:12 GMT]]></title><description><![CDATA[<blockquote>
<p>ich hatte tatsächlich auf Debug kompiliert, bei Release ist das Sortieren gut 3x so schnell (1,7 statt 5 sek)</p>
</blockquote>
<p>Ja das ist Ok. Aber nichts im Vergleich, wie wenn du STL Code in Debug/Release vergleichst. Da kann es (ist z.B bei mir) von nicht lauffähig zu praktisch kein Aufwand springen. <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>
<blockquote>
<p>die Idee, bei 10 verbleibenden Listeneinträgen auf ein O(n²)-Verfahren zu wechseln halte ich nur für bedingt sinnvoll. Werde ich aber vielleicht noch ausprobieren, wenn keinem mehr was einfällt.</p>
</blockquote>
<p>Ich habe es jetzt nicht selbst ausprobiert, aber imo wird dir das den gewünschten boost geben. Versuchs auf jeden Fall mal. Ist ja keine Sache. Stell dir einfach mal vor, was ein Funktionsaufruf so alles an Kosten bringt im vergleich zu einer Schleife. Das sind Welten. <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>btw:<br />
In tatsächlichem Code bitte zuerst <code>std::list</code> und <code>std::sort</code> benutzen. Als Übung mach das ruhig! Bin auch gespannt, wie viel das jetzt besser wird, aber in echtem Code solltest du solche Sachen eigentlich lieber die Standardbibliothek machen lassen. Effizienter, sicherer, schneller (ausser du weisst es wirklich besser, dann ist das natürlich etwas anderes).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912788</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 15 Jun 2010 14:48:12 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Tue, 15 Jun 2010 14:55:30 GMT]]></title><description><![CDATA[<p>habs jetzt mit std::list und dem hauseigenen sort implementiert und liege bei 190ms. Damit werde ich jetzt wohl weiterarbeiten auch wenns ruhig noch 10x schneller sein könnte. Vielleicht brauch ich einfach nen 20 GHz Rechner <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>
<p>Irgendwie passiert mir das zu oft. Ich beschäftige mich ne Woche mit einem Problem und am Schluss merke ich, dass es was vorgefertigtes gibt.</p>
<p>Naja, wenigstens was gelernt <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1912791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912791</guid><dc:creator><![CDATA[Godemit]]></dc:creator><pubDate>Tue, 15 Jun 2010 14:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Tue, 15 Jun 2010 15:00:29 GMT]]></title><description><![CDATA[<p>Godemit schrieb:</p>
<blockquote>
<p>Irgendwie passiert mir das zu oft. Ich beschäftige mich ne Woche mit einem Problem und am Schluss merke ich, dass es was vorgefertigtes gibt.</p>
</blockquote>
<p>Ich mache das oft mit Absicht. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1912792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912792</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 15 Jun 2010 15:00:29 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Tue, 15 Jun 2010 15:01:15 GMT]]></title><description><![CDATA[<p>Wenn du eine list hast, dann nimm unbedingt list.sort(), nicht std::sort(). Die Sortiermethode in list nutzt die Besonderheiten der datenstruktur aus und ist daher wesentlich effizienter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912793</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Jun 2010 15:01:15 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Tue, 15 Jun 2010 15:13:05 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Wenn du eine list hast, dann nimm unbedingt list.sort(), nicht std::sort().</p>
</blockquote>
<p>Ich denke, das merkt er spätestens am Compile Error.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912803</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Tue, 15 Jun 2010 15:13:05 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Tue, 15 Jun 2010 16:42:01 GMT]]></title><description><![CDATA[<p>Wenn die Zeien von <code>std::list::sort</code> wirklich kritisch sein sollten, kann man<br />
auch auf <code>boost::intrusive</code> ausweichen.<br />
<a href="http://www.boost.org/doc/libs/1_42_0/doc/html/intrusive/performance.html#intrusive.performance.performance_results_sorting" rel="nofollow">http://www.boost.org/doc/libs/1_42_0/doc/html/intrusive/performance.html#intrusive.performance.performance_results_sorting</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912845</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 15 Jun 2010 16:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Thu, 01 Jul 2010 16:18:15 GMT]]></title><description><![CDATA[<p>hallo, ich bins mal wieder <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>
<p>nachdem ich mit std::list auf Dauer nicht gut zurechtkam, bin ich nochmal auf meine eigenen doppelt verketteten Liste zurück gewechselt.</p>
<p>Mergesort braucht nun wieder seine gewohnten 530ms. Ich hab jetzt eine Abfrage eingebaut, die bei 10 oder weniger Einträgen in der Liste auf Bubblesort wechselt. Dies ändert an der Laufzeit genau garnichts. Ich hab mit der Grenze auch schon auf etwas rumgespielt (von 2 bis 20) und es ändert sich auch nichts. Erst ab ca 20 wird die Laufzeit langsam größer (560ms) bis sie irgendwann bei ein paar Stunden ankommt (alles wird mit Bubblesort sortiert) <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>
<p>Allerdings könnte diese fehlende Steigerung auch wieder am Code liegen</p>
<p>hier der bubblesort algo. Ich fands recht kompliziert, den auf doppelt verkettete Listen anzuwenden:</p>
<pre><code class="language-cpp">edge* bubblesort(edge* list, int elemente)
{
	int i;
	edge* tmp = NULL;
	edge* start = list;
	while(elemente--){
		list = start;
		for(i = 1; i &lt; elemente; i++){
			if(list-&gt;cost &gt; list-&gt;next-&gt;cost) {
				// vertauschen
				tmp = list-&gt;next;
				if (list==start) start = tmp;
				else list-&gt;prev-&gt;next = tmp;
				list-&gt;next = tmp-&gt;next;
				tmp-&gt;prev = list-&gt;prev;
				list-&gt;prev = tmp;
				if (tmp-&gt;next) tmp-&gt;next-&gt;prev = list;
				tmp-&gt;next = list;
			} else list = list-&gt;next;
		}
	}
	return start;
}
</code></pre>
<p>und mein größeres Sorgenkind:<br />
ich muss ja zuerst einmal herausfinden, wieviele Elemente die Liste überhaupt hat (um entscheiden zu können, ob merge- oder bubblesort). Das ist nicht ganz trivial, da ich die Liste erstmal durchlaufen muss, was ja wieder Zeit kostet.</p>
<p>Derzeit hab ich das so gelöst:</p>
<pre><code class="language-cpp">edge* mergesort(edge *liste)
{
    if (liste-&gt;next){
        edge *tmp2 = liste;
		int i;
		int grenze = 10;
		for (i=1;i&lt;grenze;i++) if (tmp2-&gt;next) tmp2 = tmp2-&gt;next; else break;
		if (tmp2-&gt;next==NULL){ // listenlänge &lt;= grenze
			return bubblesort(liste,i);
		} else {
    } else return liste;
}
</code></pre>
<p>ich will ja nicht die Länge der gesamten Liste wissen, sondern nur, ob sie kleiner als 10 ist, außerdem benötige ich die genaue Länge für den bubblesort algo.</p>
<p>Habt ihr da vielleicht nen Vorschlag, wie ich das geschickter lösen kann?</p>
<p>Zusätzlich ist Bubblesort nun auch nicht der idealste Algo dafür. Welcher eignet sich denn am besten für derart kurze Listen? Ich find Bogosort ganz gut, hab heute ne Glückssträhne <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>
<p>Wieder einmal danke für jeden Hilfe <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1920021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920021</guid><dc:creator><![CDATA[Godemit]]></dc:creator><pubDate>Thu, 01 Jul 2010 16:18:15 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Thu, 01 Jul 2010 20:15:55 GMT]]></title><description><![CDATA[<p>hallo mal wieder ;o)</p>
<p>Also ich komme mit</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;list&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;

#include &quot;my/timer.h&quot;

int main()
{
	int count = 100*1000;
	std::vector&lt;int&gt; vec;
	vec.reserve(count);
	for(int i=0; i != count; ++i)
		vec.push_back(i);
	std::random_shuffle(vec.begin(), vec.end());

	std::list&lt;int&gt; list(vec.begin(), vec.end());
	my::timer_t timer;
	list.sort();
	std::cout &lt;&lt; my::timer_t::get_seconds_from_ticks(timer()) &lt;&lt; std::endl;

	std::cout &lt;&lt; '\t' &lt;&lt; *list.begin() &lt;&lt; std::endl;
}
</code></pre>
<p>auf 0.032 Sekunden(x32) bzw 0.027 Sekunden(x64). (Core2Duo 2x3,0GHz; MSVC9; Release ohne Debugger)<br />
<code>int count = 10*1000*1000;</code> : 0.5Sekunden<br />
<code>int count = 100*1000*1000;</code> : 9Sekunden<br />
Klingt schneller als deine reichliche halbe Sekunde ;P</p>
<p>Falls du weiterhin ein eigenes sort brauchst: <code>std::list::splice</code> ist dein Freund.<br />
Ich fürchte aber, du wirst nicht schneller kommen.<br />
Maximal noch, wenn du etwas über die Verteilung der Zahlen in deiner Liste weist.</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920104</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 01 Jul 2010 20:15:55 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Thu, 01 Jul 2010 20:36:28 GMT]]></title><description><![CDATA[<p>Es geht doch noch schneller:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void list_sort(T&amp; to_sort)
{
	if(to_sort.size() &lt; 10000)
	{
		to_sort.sort();
		return;
	}

	try
	{
		std::vector&lt;typename T::value_type&gt; tmp(to_sort.begin(), to_sort.end());
		std::sort(tmp.begin(), tmp.end());
		to_sort.assign(tmp.begin(), tmp.end());
		return;
	}
	catch(std::bad_alloc&amp;)
	{}

	std::deque&lt;typename T::value_type&gt; tmp(to_sort.begin(), to_sort.end());
	std::sort(tmp.begin(), tmp.end());
	to_sort.assign(tmp.begin(), tmp.end());
}
</code></pre>
<p><code>if(to_sort.size() &lt; 10000)</code><br />
Die Zahl ist einfach nur geraten. Evtl ausmessen und in ne Konstante packen.<br />
Wenn man zum Programmstart Zeit hat, könnte man die auch für jeden PC &quot;ausrechnen&quot;.<br />
Also als static-Variable in die Fkt packen und beim ersten Aufruf nen paar Sortier-Vorgänge simulieren:</p>
<pre><code class="language-cpp">namespace detail
{
	template&lt;typename T&gt;
	void sort_list(T&amp; to_sort)
	{
		to_sort.sort();
	}

	template&lt;typename T&gt;
	void sort_and_assign(T&amp; to_sort)
	{
		try
		{
			std::vector&lt;typename T::value_type&gt; tmp(to_sort.begin(), to_sort.end());
			std::sort(tmp.begin(), tmp.end());
			to_sort.assign(tmp.begin(), tmp.end());
			return;
		}
		catch(std::bad_alloc&amp;)
		{}

		try
		{
			std::deque&lt;typename T::value_type&gt; tmp(to_sort.begin(), to_sort.end());
			std::sort(tmp.begin(), tmp.end());
			to_sort.assign(tmp.begin(), tmp.end());
			return;
		}
		catch(std::bad_alloc&amp;)
		{}

		sort_list(to_sort);
	}

	template&lt;typename S, typename T&gt;
	S get_performance_bound_for_list_search(const T&amp;)
	{
		S ret_val = 32;

		my::timer_t::tick_type ticks_list_sort;
		my::timer_t::tick_type ticks_assign_and_sort;

		do
		{
			if(ret_val &gt;= std::numeric_limits&lt;S&gt;::max()/2)
				return std::numeric_limits&lt;S&gt;::max();

			ret_val *= 2;
			std::list&lt;S&gt; list1, list2;
			{
				std::vector&lt;S&gt; vec;
				vec.reserve(ret_val);
				for(S i=0; i != ret_val; ++i)
					vec.push_back(i);
				std::random_shuffle(vec.begin(), vec.end());
				list1.assign(vec.begin(), vec.end());
				list2.assign(vec.begin(), vec.end());
			}

			my::timer_t timer;
			detail::sort_list(list1);
			ticks_list_sort = timer();

			timer.reset();
			detail::sort_and_assign(list2);
			ticks_assign_and_sort = timer();

		} while(ticks_list_sort &lt; ticks_assign_and_sort);

		return ret_val;
	}
}

template&lt;typename T&gt;
void list_sort(T&amp; to_sort, bool strict_use_list_sort = false)
{
	static typename T::size_type performance_bound_for_list_search = detail::get_performance_bound_for_list_search&lt;typename T::size_type&gt;(to_sort);

	if(strict_use_list_sort || to_sort.size() &lt; performance_bound_for_list_search)
	{
		detail::sort_list(to_sort);
	}
	else
	{
		detail::sort_and_assign(to_sort);
	}
}

int main()
{
	int count = 10*1000*1000;
	std::vector&lt;int&gt; vec;
	vec.reserve(count);
	for(int i=0; i != count; ++i)
		vec.push_back(i);
	std::random_shuffle(vec.begin(), vec.end());

	std::list&lt;int&gt; list(vec.begin(), vec.end());

	my::timer_t timer;
	list_sort(list);
	std::cout &lt;&lt; my::timer_t::get_seconds_from_ticks(timer()) &lt;&lt; std::endl;

	std::cout &lt;&lt; '\t' &lt;&lt; *list.begin() &lt;&lt; std::endl;
}
</code></pre>
<p>Zeigt, dass das list-sort immer langsamer ist als das umkopieren und kopieren (zumindest bei mir).<br />
Das hab ich erst nicht geglaubt und noch nen Sleep in die Umkopier-Variante gemacht, aber dann hab ichs auch geglaubt... ^^<br />
Aber evtl gibts ja nen System, wo ein new (erheblich) teurer ist... ^^</p>
<p>Das einzige, was man jz noch machen könnte, wäre den entsprechnenden Allokator zu nutzen - aber das wird wohl kaum jmd brauchen (es sei denn, du hast irgend nen GC, den du nutzt)... ^^</p>
<p>bb</p>
<p>PS: Anwendung bleibt wie gehabt:</p>
<pre><code class="language-cpp">list_sort(list);
</code></pre>
<p>evtl sollte man die fkt auch in <code>inplace_sort</code> oder so umbenennen - kA...</p>
<p>edit: was ich vergessen habe zu erwähnen: Bei den Tests wird list&lt;size_type&gt; anstatt list&lt;value_type&gt; genutzt - das liegt daran, dass value_type nicht zwangsläufig einen CTor besitzen muss, der einen Integer-Wert entgegennimmt - und da ist mir nix besseres eingefallen, als den size_type zu nehmen. Einfach nur <code>value_type()</code> zu nehmen, war mir zu gefährlich beim Testen - evtl. gibt es ja list.sort()-Implementierungen, die zu erst gucken, ob schon geordnet ist - weiterhin gibt es ja auch nicht immer einen Standard-CTor. Kurz: wenn die Objekte kompliziert(zeitaufwendig) zu kopieren sind, dann solltest du den test entsprechend anpassen...</p>
<p>edit #2:<br />
Zeile 46-48 im zweiten Quellcode eingefügt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920124</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 01 Jul 2010 20:36:28 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Thu, 01 Jul 2010 20:47:41 GMT]]></title><description><![CDATA[<p>ja, bei dem Test ist das auch erstmal kein Wunder. Immerhin ist das kopieren von ints nicht wirklich teuer - und dann ist die ganze Listenoptimierung im Eimer. Dast du aber Objekte, die nicht trivial kopierbar sind, oder die einen großen State haben, dann zieht dir die Liste sofort davon.</p>
<p>Was mich viel eher interessieren würd eist, welche Probleme der Threadstarter mit der std::list hatte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920140</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 01 Jul 2010 20:47:41 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Thu, 01 Jul 2010 21:00:46 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>ja, bei dem Test ist das auch erstmal kein Wunder. Immerhin ist das kopieren von ints nicht wirklich teuer - und dann ist die ganze Listenoptimierung im Eimer. Dast du aber Objekte, die nicht trivial kopierbar sind, oder die einen großen State haben, dann zieht dir die Liste sofort davon.</p>
</blockquote>
<p>Jopp - habe ich ja auch geschrieben.<br />
Ist aber eben auch kein Problem, das zu ändern - auch das habe ich aber geschrieben...<br />
Allerdings hat der TO ja explizit ints verwendet.</p>
<blockquote>
<p>Was mich viel eher interessieren würd eist, welche Probleme der Threadstarter mit der std::list hatte...</p>
</blockquote>
<p>ich nehme an, es lag daran, dass er list::sort nicht gefunden hatte und std::sort nicht ging und dann hat er splice nicht gefunden und konnte somit die Zeiger nicht umbiegen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920157</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 01 Jul 2010 21:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Fri, 02 Jul 2010 08:49:56 GMT]]></title><description><![CDATA[<p>das Problem mit std::list hat nichts mit dem sortieren zu tun. Das funktioniert tadellos und schnell.</p>
<p>Mein Problem war, dass ich im späteren Verlauf des Programms Zeiger auf einzelne Listenelemente benötigt und das überhaupt nicht hinbekommen hab.</p>
<p>Daraufhin hab ich mich entschlossen, lieber eine komplett eigene Datenstruktur zu benutzen, die ich dafür vollständig verstehe.</p>
<p>Vielleicht noch was über die Daten, die zu sortieren sind: Es sind integer Werte zwischen 0 und 765 mit einem sehr hohen Anteil von kleinen Werten (12% sind 0, 74% unter 10, 95% unter 100)</p>
<p>Welches Verfahren sortiert mir eine Liste mit 10 solcher Werte am schnellsten?</p>
<p>Gruß<br />
Godemit</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920307</guid><dc:creator><![CDATA[Godemit]]></dc:creator><pubDate>Fri, 02 Jul 2010 08:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to Mergesort sehr langsam on Fri, 02 Jul 2010 09:17:06 GMT]]></title><description><![CDATA[<p>Godemit schrieb:</p>
<blockquote>
<p>Mein Problem war, dass ich im späteren Verlauf des Programms Zeiger auf einzelne Listenelemente benötigt und das überhaupt nicht hinbekommen hab.</p>
</blockquote>
<p>An deiner Stelle würde ich mich dann mit std::list (und Iteratoren bei diesem speziellen Problem) vertraut machen, anstatt das Rad neuzuerfinden. Dadurch wirst du auch sehr viel Zeit sparen, denn den Umgang mit std::list hast du nach spätestens ein paar Stunden raus. In der Zeit hast du keine eigene gute, schnelle, exceptionsichere, fehlerfreie Klasse geschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920315</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Fri, 02 Jul 2010 09:17:06 GMT</pubDate></item></channel></rss>