<?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[std::list::sort vs. std::sort]]></title><description><![CDATA[<p>Hi,</p>
<p>ich hab hier eine C Liste vor mir, kann aber genauso gut eine C++ Implementierung sein, die nur Zeiger auf Objekte speichert.</p>
<p>Die Sortierfunktion ist so implementiert:</p>
<p>1. Kopiere alle Zeiger in ein Array<br />
2. Rufe std::sort auf<br />
3. Kopiere die sortierten Zeiger in die Liste.</p>
<p>Ich hab mir jetzt gedacht: Was soll der Scheiß? Aber ich bin mir nicht ganz sicher, dass ein Algorithmus, wie in std::list::sort (ich glaube in der stdlibc++ ist es Mergesort) verwendet, hier überwiegend schneller sein würde.</p>
<p>Ich hab nicht die Zeit einen Benchmark aufzusetzen. Was ist eure Erfahrung oder Meinung. Ist diese Methode brauchbar oder sollte man immer den Algorithmus von std::list::sort nehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/175490/std-list-sort-vs-std-sort</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 04:49:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/175490.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 Mar 2007 10:26:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 10:26:43 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich hab hier eine C Liste vor mir, kann aber genauso gut eine C++ Implementierung sein, die nur Zeiger auf Objekte speichert.</p>
<p>Die Sortierfunktion ist so implementiert:</p>
<p>1. Kopiere alle Zeiger in ein Array<br />
2. Rufe std::sort auf<br />
3. Kopiere die sortierten Zeiger in die Liste.</p>
<p>Ich hab mir jetzt gedacht: Was soll der Scheiß? Aber ich bin mir nicht ganz sicher, dass ein Algorithmus, wie in std::list::sort (ich glaube in der stdlibc++ ist es Mergesort) verwendet, hier überwiegend schneller sein würde.</p>
<p>Ich hab nicht die Zeit einen Benchmark aufzusetzen. Was ist eure Erfahrung oder Meinung. Ist diese Methode brauchbar oder sollte man immer den Algorithmus von std::list::sort nehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243228</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Sun, 11 Mar 2007 10:26:43 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 11:10:19 GMT]]></title><description><![CDATA[<p>wenn die Liste Zeiger auf Objekte speichert... dann bringt es doch nichts die Zeiger zu sortieren...<br />
Dann hast du deine Objekte im Speicher nach ihrer Anordnung sortiert und niht nach ihren Werten. wenn dann musst du schon das vergleichen worauf die zeiger zeigen.</p>
<p>Also ich denke es kommt auf die Listengröße an, list::sort ist eben nicht besonders schnell, weil da kein Direktzugriff ist. Weiß jetzt nich, wie das genau implementiert ist, aber ich schätz ma bubblesort oder so, also quadratisch laufzeit. std::sort hat ja logarithmische Laufzeit. Musst gucken... zu der Laufzeit musst du ja noch zwei Kopiervorgänge dazurechnen, samt aufbauen und löschen der Listen-zeiger. Ein Benchmark dazu is doch aber auch ncih sooo kompliziert dafür eigentlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243243</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sun, 11 Mar 2007 11:10:19 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 11:14:50 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>wenn die Liste Zeiger auf Objekte speichert... dann bringt es doch nichts die Zeiger zu sortieren...<br />
Dann hast du deine Objekte im Speicher nach ihrer Anordnung sortiert und niht nach ihren Werten. wenn dann musst du schon das vergleichen worauf die zeiger zeigen.</p>
<p>Also ich denke es kommt auf die Listengröße an, list::sort ist eben nicht besonders schnell, weil da kein Direktzugriff ist. Weiß jetzt nich, wie das genau implementiert ist, aber ich schätz ma bubblesort oder so, also quadratisch laufzeit. std::sort hat ja logarithmische Laufzeit. Musst gucken... zu der Laufzeit musst du ja noch zwei Kopiervorgänge dazurechnen, samt aufbauen und löschen der Listen-zeiger. Ein Benchmark dazu is doch aber auch ncih sooo kompliziert dafür eigentlich.</p>
</blockquote>
<p>1. Natürlich wird da eine Vergleichsfunktion mitgegeben, welche die Objekte hinter den Zeigern vergleicht.</p>
<p>2. std::list::sort ist auch O(nlogn) genauso wie std::sort</p>
<p>3. Das Ab- und Aufbauen der Liste entfällt, da beim Zurückschreiben einfach die Zeiger neu gesetzt werden. Es gibt ja nach dem Sortieren genauso viele Elemente, wie vorher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243246</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Sun, 11 Mar 2007 11:14:50 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 11:20:39 GMT]]></title><description><![CDATA[<p>Äh, also wenn ich ein std::list habe und die sortieren will, mach ich das immer über std::list::sort, der sort-Algo wurde IIRC an die Bedürfnisse von std::list angepasst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243249</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Sun, 11 Mar 2007 11:20:39 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 11:22:29 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>Also ich denke es kommt auf die Listengröße an, list::sort ist eben nicht besonders schnell, weil da kein Direktzugriff ist. Weiß jetzt nich, wie das genau implementiert ist, aber ich schätz ma bubblesort oder so, also quadratisch laufzeit. std::sort hat ja logarithmische Laufzeit. Musst gucken... zu der Laufzeit musst du ja noch zwei Kopiervorgänge dazurechnen, samt aufbauen und löschen der Listen-zeiger. Ein Benchmark dazu is doch aber auch ncih sooo kompliziert dafür eigentlich.</p>
</blockquote>
<p>naja, list::sort kann man auch ertne als quicksort implementieren. das wäre sehr naheliegend und oft rasend schnell. oder wie erwähnt mergesort, das immer ausreichend schnell ist.</p>
<p>zum umkopieren: ich würde auch im array nur die zeiger auf die daten speichern und dann nen entsprechenden verkleicher &quot;bool ptrLess(T* a,T* b){return *a&lt;*b;}&quot; mitgeben.</p>
<p>was in vorliegenden fall besser ist, muss man wohl ausmessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243250</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 11 Mar 2007 11:22:29 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 11:38:14 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich denke, man kann mit ziemlicher Sicherheit davon ausgehen, dass 'std::list::sort' ein Mergesort ist. Dementsprechend denke ich, dass es auf *auf jeden Fall* schneller ist als das Kopieren in einen Vektor und Sortieren mit 'std::sort'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243265</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 11 Mar 2007 11:38:14 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 11:41:06 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>naja, list::sort kann man auch ertne als quicksort implementieren. das wäre sehr naheliegend und oft rasend schnell.</p>
</blockquote>
<p>Huch? Wie implementiert man denn ein effizientes Quicksort auf Listen? Ich wäre sehr an einem (Pseudo-)Code interessiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243267</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 11 Mar 2007 11:41:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 11:56:25 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>naja, list::sort kann man auch ertne als quicksort implementieren. das wäre sehr naheliegend und oft rasend schnell.</p>
</blockquote>
<p>Huch? Wie implementiert man denn ein effizientes Quicksort auf Listen? Ich wäre sehr an einem (Pseudo-)Code interessiert.</p>
</blockquote>
<p>mal annehmen, daß ich zeiger auf anfang und ende der liste hab oder nen ring.</p>
<pre><code>void quicksort(list li){
   pivot=li.popfront          //O(1)
   list left
   list right
   while(!li.isEmpty)         //O(1)
      x&amp;=li.popfront          //O(1)
      if(x=pivot)             //O(1)
         left.pushback(x)     //O(1)
      else                    //O(1)
         right.pushback(x)    //O(1)
   quicksort(left)
   quicksort(right)
   moveallelems from left to end of li  //O(1)
   li.pushback(pivot)                   //O(1)
   moveallelems from left to end of li  //O(1)
}
</code></pre>
<p>offensichtlich ein gutes quicksort. man muss nur den kern von quicksort in die listen-teminologie mogeln, statt die liste als array zu sehen und dort ein array-quicksort drauf zu machen.</p>
<p>schlimmstensfalls hat man nur nen stack, also nur pushFront, popFront, isEmpty und peekFront implementiert (alle O(1) natürlich) und innendrin nur nen zeiger auf erste elem und pro elem einen zeiger auf den nachfolger.</p>
<p>auch dann kriegt man ein feines quicksort hin. nur ändert sich in jeder rekursionstiefe die sortierreihenfolge, da muß man ein wenig aufpassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243274</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 11 Mar 2007 11:56:25 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 12:11:14 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>offensichtlich ein gutes quicksort.</p>
</blockquote>
<p>Ja, aber doch wohl ein elend langsames. Du konstruierst hier 2 * n neue Listen und schiebst Elemente in sie rein. Das sind zwar alles elementare Operationen aber meines Wissens belasten die die Heap-Verwaltung ganz schön. Wo liegt mein Denkfehler?</p>
<p>Die SGI-Implementierung verstehe ich ehrlich gesagt überhaupt nicht. So, wie ich das sehe, wird da ganz zu Anfang das erste Element rausgeschmissen und nie wieder eingefügt. Wo isses hin?</p>
<pre><code class="language-cpp">template &lt;class _Tp, class _Alloc&gt;
void list&lt;_Tp, _Alloc&gt;::sort()
{
    list&lt;_Tp, _Alloc&gt; carry;
    list&lt;_Tp, _Alloc&gt; counter[64];
    int fill = 0;

    while (not empty()) {
        carry.splice(carry.begin(), *this, begin());
        int i = 0;

        while(i &lt; fill and not counter[i].empty()) {
            counter[i].merge(carry);
            carry.swap(counter[i++]);
        }

        carry.swap(counter[i]);         
        if (i == fill) ++fill;
    } 

    for (int i = 1; i &lt; fill; ++i)
        counter[i].merge(counter[i - 1]);

    swap(counter[fill - 1]);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1243283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243283</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 11 Mar 2007 12:11:14 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 12:29:26 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>offensichtlich ein gutes quicksort.</p>
</blockquote>
<p>Ja, aber doch wohl ein elend langsames. Du konstruierst hier 2 * n neue Listen und schiebst Elemente in sie rein. Das sind zwar alles elementare Operationen aber meines Wissens belasten die die Heap-Verwaltung ganz schön. Wo liegt mein Denkfehler?</p>
</blockquote>
<p>darin, daß man gar keine neuen heap-elemente anlegen muß. ich habs der einfachheit halber im psodocode getan. es reicht natürlich, die elemnte leben zu lassen und nur die verzeigerung zu ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243292</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 11 Mar 2007 12:29:26 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 12:41:37 GMT]]></title><description><![CDATA[<p>gelöcht, war unfug</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243297</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 11 Mar 2007 12:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 12:58:32 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;class _Tp, class _Alloc&gt;
void list&lt;_Tp, _Alloc&gt;::sort()
{
    list&lt;_Tp, _Alloc&gt; carry;
    list&lt;_Tp, _Alloc&gt; counter[64];
    int fill = 0;

    while (not empty()) {
        carry.splice(carry.begin(), *this, begin());//ein elem nach carry holen
        int i = 0;

//also in carry ist 1 elem. 
//und in counter[0] auch (ok, erst im zweiten durchlauf ist da was)

//nun mische ich carry und counter[0] zusammen und erhalte eine doppelt so 
//große liste in counter[0]
//die swappe ich nach carry und mache dabei counter[0] leer. und gehe zu counter[1]. 

//mein carry-sack ist jetzt auch doppelt so groß. wenn ich ein gleichgroßes 
//opfer in counter[1] finde, mische ich wieder zusammen. so lange, 
//wie ich opfer finde. 

        while(i &lt; fill and not counter[i].empty()) {
            counter[i].merge(carry);
            carry.swap(counter[i++]);
        }

        carry.swap(counter[i]);         
        if (i == fill) ++fill;
    } 

    for (int i = 1; i &lt; fill; ++i)
        counter[i].merge(counter[i - 1]);

    swap(counter[fill - 1]);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1243310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243310</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 11 Mar 2007 12:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 13:05:34 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>carry.splice(carry.begin(), *this, begin());//ein elem nach carry holen</p>
</blockquote>
<p>Ah. Aus der cppreference-Doku lese ich das Gegenteil heraus:</p>
<blockquote>
<pre><code class="language-cpp">void splice( iterator pos, list&amp; lst, iterator del );
</code></pre>
<p>The splice() function inserts lst at location pos. [...] the element... at del [is] removed.</p>
</blockquote>
<p>=&gt; Klingt für mich danach, dass 'this' nach 'pos' kopiert wird, mit Ausnahme von 'begin()'.</p>
<blockquote>
<p>//nun mische ich carry und counter[0] zusammen und erhalte eine doppelt so<br />
//große liste in counter[0]<br />
//die swappe ich nach carry und mache dabei counter[0] leer. und gehe zu counter[1].</p>
<p>//mein carry-sack ist jetzt auch doppelt so groß. wenn ich ein gleichgroßes<br />
//opfer in counter[1] finde, mische ich wieder zusammen. so lange,<br />
//wie ich opfer finde.</p>
</blockquote>
<p>Soweit klar. Trotzdem vermisse ich irgendwie einen Vergleich. Es wird hier doch an keinem Punkt ein Vergleich oder wenigstens eine Metrik aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243316</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 11 Mar 2007 13:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 13:07:55 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Soweit klar. Trotzdem vermisse ich irgendwie einen Vergleich. Es wird hier doch an keinem Punkt ein Vergleich oder wenigstens eine Metrik aufgerufen.</p>
</blockquote>
<p>vergleich? metrik? was genau vermißt du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243318</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 11 Mar 2007 13:07:55 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 13:11:32 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Soweit klar. Trotzdem vermisse ich irgendwie einen Vergleich. Es wird hier doch an keinem Punkt ein Vergleich oder wenigstens eine Metrik aufgerufen.</p>
</blockquote>
<p>vergleich? metrik? was genau vermißt du?</p>
</blockquote>
<p>vergleiche sehe ich zwei.<br />
innerhalb von counter[i].merge(carry);, da wird immer elementweise nach größe verglichen.</p>
<p>und bei<br />
and not counter[i].empty())<br />
da wird per hand binär hochgezählt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243324</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 11 Mar 2007 13:11:32 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 13:14:35 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>vergleich? metrik? was genau vermißt du?</p>
</blockquote>
<p>Na ja, mit einer Metrik könnte man drei Punkte anhand ihrer Entfernungen zueinander anordnen. Ist aber in diesem Zusammenhang natürlich Quatsch, da man aufsteigend oder absteigend nicht bestimmen könnte.</p>
<blockquote>
<p>innerhalb von counter[i].merge(carry);, da wird immer elementweise nach größe verglichen.</p>
</blockquote>
<p>Aaah. Okay, damit wird einiges klarer. Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243327</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 11 Mar 2007 13:14:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 13:20:11 GMT]]></title><description><![CDATA[<p>ganz zufällig habe ich so einen hochzähl-trick erst vor wenigen wochen auch programmiert.</p>
<p>als batch-datei in winxp.</p>
<p>das wichtigste dran ist</p>
<pre><code>@echo off
set pos=-1
:nextLevel
set /A pos=%pos%+1
if exist %pos%.digit (
 del %pos%.digit&quot;
 goto nextLevel
)
echo.&gt;%pos%.digit&quot;
</code></pre>
<p>das zählt bei jedem aufruf eine binärzahl um 1 hoch, die als bits veteilt (die jeweils duch die existenz der datei bitnummer.digit) auf der platte liegt. und gibt mir die variable pos, die dann meine backup-zeildatei ist. damit halte ich weniger der älteren backups vor, genau das, was ich mag.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243332</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 11 Mar 2007 13:20:11 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 20:46:06 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>offensichtlich ein gutes quicksort.</p>
</blockquote>
<p>Die SGI-Implementierung verstehe ich ehrlich gesagt überhaupt nicht. So, wie ich das sehe, wird da ganz zu Anfang das erste Element rausgeschmissen und nie wieder eingefügt. Wo isses hin?</p>
</blockquote>
<p>Ich weiss nicht genau wie der Algorithmus heisst, aber er funktioniert so:</p>
<p>Du hast eine Liste carry, die als Arbeitspferd dient. Dann hast du 64 Listen im Array counter. Für jede dieser Listen gilt folgende Eigenschaft:</p>
<p><div class="plugin-markdown"><input type="checkbox" id="checkbox269390" checked="true" /><label for="checkbox269390">enthält nach jeder Iteration höchstens 2^x Elemente. Zusätzlich sind die Elemente sortiert.</label></div></p>
<p>Dies bedeutet, dass counter[0] maximal 1 Element enthält. counter[5] hat maximal 32 Elemente. Insgesamt dürfen in counter höchstens 2^64-1 Elemente drin sein. Das sollte auf heutigen Rechnern ausreichen. Wenn das aber mal ein Problem wird, kann man einfach das Limit erhöhen.</p>
<p>Nun wird einfach der Reihe nach ein Element aus der Ursprungsliste entfernt und in counter[0] sortiert reingetan. Wird die obige Bedingung verletzt wird counter[0] mit counter[1] sortiert vermengt (std::sort::merge) und das Ergebnis ist in counter[1]. Falls die Bedingung immer noch verletzt ist, wird das beliebig weitergetan.</p>
<p>Man kann nach der x-ten Iteration genau sagen, wieviele Elemente in den einzelnen counter Listen liegen. Es ist einfach die Binärdarstellung von x.</p>
<p>Am ende werden alle listen in counter sortiert vermengt und das Ergebnis wird in die Ursprungsliste geschrieben.</p>
<p>Anmerkungen:</p>
<p>Die benutzten Funktionen merge(), splice() und swap() legen keine neuen Listenelemente an, sondern biegen nur existierende um.</p>
<p>Die Vergleiche für das Sortieren finden in merge() statt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243618</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Sun, 11 Mar 2007 20:46:06 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 20:58:04 GMT]]></title><description><![CDATA[<p>Ein kleiner Test sagt mir, dass die Benutzung von std::sort schneller ist, als die Benutzung von std::list::sort. Zumindest für int. Sollte aber auch für Zeiger gelten.</p>
<p>Das hätte ich nicht erwartet.</p>
<p>Wenn man sich also den Overhead leisten kann und man die Laufzeit benötigt, dann ist std::sort schneller.</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;list&gt;

extern &quot;C&quot; {
#include &lt;sys/time.h&gt; 
}

void vectorsort(std::list&lt;int&gt; list) {

   std::vector&lt;int&gt; vec(list.begin(), list.end());
   std::sort(vec.begin(), vec.end());
   list.assign(vec.begin(), vec.end());
}

void listsort(std::list&lt;int&gt; list) {
   list.sort();
}

int main() {

   std::list&lt;int&gt; list;

   for (int i = 0; i &lt; 1000000; ++i) {
      list.push_back(random());  
   }

   struct timeval start, stop;
   gettimeofday(&amp;start, NULL);
   vectorsort(list);
   gettimeofday(&amp;stop, NULL);

   std::cout &lt;&lt; &quot;Sorting time using std::sort:       &quot; &lt;&lt; (stop.tv_sec - start.tv_sec) * 1000000 + (stop.tv_usec - start.tv_usec) &lt;&lt; &quot; ms\n&quot;;

   gettimeofday(&amp;start, NULL);
   listsort(list);
   gettimeofday(&amp;stop, NULL);

   std::cout &lt;&lt; &quot;Sorting time using std::list::sort: &quot; &lt;&lt; (stop.tv_sec - start.tv_sec) * 1000000 + (stop.tv_usec - start.tv_usec) &lt;&lt; &quot; ms\n&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1243631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243631</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Sun, 11 Mar 2007 20:58:04 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 21:44:46 GMT]]></title><description><![CDATA[<p>Hm, ich bin mir jetzt nicht sicher, aber liefert dein Aufruf von gettimeofday nicht einfach die verstrichene Zeit, anstatt der benutzten CPU-Zeit?<br />
Na ja, hier mein Test (mit Timer Klasse und direktem Aufruf der sort-Algos):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;list&gt;
#include &lt;algorithm&gt;

#include &lt;ctime&gt;
#include &lt;cstdlib&gt;

class Timer {
	clock_t start_, end_;

	Timer(const Timer&amp;);
	Timer&amp; operator=(const Timer&amp;);

public:
	Timer() {}
	virtual ~Timer() {}

	void start() { start_ = clock(); }

	void stop() { end_ = clock(); }

	float diff() {
		return static_cast&lt;float&gt;(end_ - start_) /
			static_cast&lt;float&gt;(CLOCKS_PER_SEC);
	}

	float elapsed() {
		return static_cast&lt;float&gt;(end_ = clock() - start_) /
			static_cast&lt;float&gt;(CLOCKS_PER_SEC);
	}
}; 

int main() {
	srand(time(NULL));

	std::list&lt;int&gt; list;

	for (int i = 0; i &lt; 1000000; ++i) {
		list.push_back(rand()%2000);  
	}
	Timer t1;
	t1.start();
	std::vector&lt;int&gt; vec(list.begin(), list.end());
	std::sort(vec.begin(), vec.end());
	list.assign(vec.begin(), vec.end());
	t1.stop();

	std::cout &lt;&lt; &quot;Sorting time using std::sort: &quot; &lt;&lt; t1.diff() &lt;&lt; &quot; ms\n&quot;;

	//Timer t2;
	t1.start();
	list.sort();
	t1.stop();

	std::cout &lt;&lt; &quot;Sorting time using std::list::sort: &quot; &lt;&lt; t1.diff() &lt;&lt; &quot; ms\n&quot;;
	return EXIT_SUCCESS;
}
</code></pre>
<p>Hier schneidet std::list::sort deutlich besser ab:</p>
<pre><code>Sorting time using std::sort: 0.64 ms
Sorting time using std::list::sort: 0.297 ms
</code></pre>
<p>EDIT 1+2: Code und Ergebnisse geändert.</p>
<p>EDIT 3:<br />
Wenn man die listen per Referenz an die Funktionen übergibt, sieht's so aus:</p>
<pre><code>Sorting time using std::sort: 0.625 ms
Sorting time using std::list::sort: 0.312 ms
</code></pre>
<p>Macht man die Funktionen zusätzlich inline, tut sich nicht mehr viel am Ergebnis.</p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243661</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Sun, 11 Mar 2007 21:44:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Sun, 11 Mar 2007 22:57:23 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>Hm, ich bin mir jetzt nicht sicher, aber liefert dein Aufruf von gettimeofday nicht einfach die verstrichene Zeit, anstatt der benutzten CPU-Zeit?<br />
Na ja, hier mein Test (mit Timer Klasse und direktem Aufruf der sort-Algos):</p>
</blockquote>
<p>Ja. Mit gettimeofday messe ich die Realzeit. Bei so klaren Unterschieden ist es nicht notwendig CPU-Zeit zu messen.</p>
<p>Ich habe außerdem die Listen nicht als Referenz übergeben, damit beide Algorithmen die selbe Startliste haben. Mit Referenzen und in deinem Code übergibst du dem std::list::sort eine bereits sortierte Liste mit. Das Ergebnis ist damit nicht aussagekräftig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243691</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Sun, 11 Mar 2007 22:57:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Mon, 12 Mar 2007 00:32:23 GMT]]></title><description><![CDATA[<p>Ponto schrieb:</p>
<blockquote>
<p>GPC schrieb:</p>
<blockquote>
<p>Hm, ich bin mir jetzt nicht sicher, aber liefert dein Aufruf von gettimeofday nicht einfach die verstrichene Zeit, anstatt der benutzten CPU-Zeit?<br />
Na ja, hier mein Test (mit Timer Klasse und direktem Aufruf der sort-Algos):</p>
</blockquote>
<p>Ja. Mit gettimeofday messe ich die Realzeit. Bei so klaren Unterschieden ist es nicht notwendig CPU-Zeit zu messen.</p>
</blockquote>
<p>okay</p>
<blockquote>
<p>Ich habe außerdem die Listen nicht als Referenz übergeben, damit beide Algorithmen die selbe Startliste haben. Mit Referenzen und in deinem Code übergibst du dem std::list::sort eine bereits sortierte Liste mit. Das Ergebnis ist damit nicht aussagekräftig.</p>
</blockquote>
<p>Fuck, das hab ich glatt verpennt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Na jo, damit hast du Recht, hier ist std::sort wirklich schneller als std::list::sort... was mich jetzt aber wundert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243711</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Mon, 12 Mar 2007 00:32:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Mon, 12 Mar 2007 11:18:34 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>Hier schneidet std::list::sort deutlich besser ab:</p>
<pre><code>Sorting time using std::sort: 0.64 ms
Sorting time using std::list::sort: 0.297 ms
</code></pre>
</blockquote>
<p>komisch. ich hätte dem introsort aber deutlich mehr performance zugetraut als einem lächerlichen mergesort.<br />
miss dich auch mal für 10 mio elemente und 100 mio elemente (und wenn du genug ram hast 1000 mio).<br />
und nicht mit rand()%2000, sondern mir rand().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1243871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1243871</guid><dc:creator><![CDATA[volkardus]]></dc:creator><pubDate>Mon, 12 Mar 2007 11:18:34 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Mon, 12 Mar 2007 16:41:05 GMT]]></title><description><![CDATA[<p>Äh, die &quot;Ergebnisse&quot; sind wertlos, da std::list::sort eine bereits sortierte Liste sortiert hat, ich war wohl nicht ganz bei der Sache, als ich das machte <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 />
Interessieren würde mich allerdings, wie meine selbstgebaute uralt-Liste dagegen performt... mal schauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244160</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Mon, 12 Mar 2007 16:41:05 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Mon, 12 Mar 2007 17:49:54 GMT]]></title><description><![CDATA[<p>Hab den Quellcode etwas modifiziert:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;list&gt;

extern &quot;C&quot; {
#include &lt;sys/time.h&gt;
}

void vectorsort(std::list&lt;int&gt; list) {
   struct timeval start, stop;
   gettimeofday(&amp;start, NULL);
   std::vector&lt;int&gt; vec(list.begin(), list.end());
   std::sort(vec.begin(), vec.end());
   list.assign(vec.begin(), vec.end());
   gettimeofday(&amp;stop, NULL);
   std::cout &lt;&lt; &quot;Sorting time using std::sort:       &quot; &lt;&lt; (stop.tv_sec - start.tv_sec) * 1000000 + (stop.tv_usec - start.tv_usec) &lt;&lt; &quot; us\n&quot;;
}

void listsort(std::list&lt;int&gt; list) {
   struct timeval start, stop;
   gettimeofday(&amp;start, NULL);
   list.sort();
   gettimeofday(&amp;stop, NULL);
   std::cout &lt;&lt; &quot;Sorting time using std::list::sort: &quot; &lt;&lt; (stop.tv_sec - start.tv_sec) * 1000000 + (stop.tv_usec - start.tv_usec) &lt;&lt; &quot; us\n&quot;;
}

int main() {

   std::list&lt;int&gt; list;

   for (int i = 0; i &lt; 1000000; ++i) {
      list.push_back(random());
   }

   struct timeval start, stop;

   vectorsort(list);
   listsort(list);
   vectorsort(list);
   listsort(list);
   vectorsort(list);
   listsort(list);
   vectorsort(list);
   listsort(list);  
}
</code></pre>
<p>1.000.000 Elemente:</p>
<blockquote>
<p>Sorting time using std::sort: 186023 us<br />
Sorting time using std::list::sort: 938861 us<br />
Sorting time using std::sort: 615975 us<br />
Sorting time using std::list::sort: 2073201 us<br />
Sorting time using std::sort: 704289 us<br />
Sorting time using std::list::sort: 2033904 us<br />
Sorting time using std::sort: 668453 us<br />
Sorting time using std::list::sort: 2029653 us</p>
</blockquote>
<p>10.000.000 Elemente:</p>
<blockquote>
<p>Sorting time using std::sort: 2020496 us<br />
Sorting time using std::list::sort: 26830949 us<br />
Sorting time using std::sort: 11975191 us<br />
Sorting time using std::list::sort: 52479697 us<br />
Sorting time using std::sort: 12099630 us<br />
Sorting time using std::list::sort: 53836998 us<br />
Sorting time using std::sort: 13060649 us<br />
Sorting time using std::list::sort: 53148505 us</p>
</blockquote>
<p>100.000.000 Elemente:</p>
<blockquote>
<p>Sorting time using std::sort: 21028156 us<br />
Sorting time using std::list::sort: 256302313 us<br />
Sorting time using std::sort: 120128629 us<br />
Sorting time using std::list::sort: 511849305 us<br />
Sorting time using std::sort: 102596007 us<br />
Sorting time using std::list::sort: 510751965 us<br />
Sorting time using std::sort: 102630509 us<br />
Sorting time using std::list::sort: 496394299 us</p>
</blockquote>
<p>1000 Mio scheitern nicht am RAM, sondern an der Zeit.</p>
<p>Was ich mich nun frage, ist warum die ersten zwei Iterationen schneller sind als der Rest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1244215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244215</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Mon, 12 Mar 2007 17:49:54 GMT</pubDate></item><item><title><![CDATA[Reply to std::list::sort vs. std::sort on Mon, 12 Mar 2007 19:20:44 GMT]]></title><description><![CDATA[<p>Hehe, das ist schräg.</p>
<p>Aber immerhin bin ich mit meiner eigenen &quot;dunkle Zeiten&quot; - Liste knapp am std::sort dran:</p>
<pre><code>Sorting time using std::sort: 0.484375 ms
Sorting time using std::list::sort: 2.46875 ms
Sorting time using my own list: 0.492188 ms
</code></pre>
<p>Allerdings habe ich auch einfach die Liste in ein Array gedumpt und das per quicksort sortiert, also nix großartiges.</p>
<p>Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
#include &lt;vector&gt; 
#include &lt;list&gt; 
#include &lt;algorithm&gt; 

#include &lt;ctime&gt; 
#include &lt;cstdlib&gt;

#include &quot;linkedlist.hpp&quot;

class Timer { 
    clock_t start_, end_; 

    Timer(const Timer&amp;); 
    Timer&amp; operator=(const Timer&amp;); 

	public: 
    Timer() {} 
    virtual ~Timer() {} 

    void start() { start_ = clock(); } 

    void stop() { end_ = clock(); } 

    float diff() { 
        return static_cast&lt;float&gt;(end_ - start_) / 
            static_cast&lt;float&gt;(CLOCKS_PER_SEC); 
	} 

    float elapsed() { 
        return static_cast&lt;float&gt;(end_ = clock() - start_) / 
            static_cast&lt;float&gt;(CLOCKS_PER_SEC); 
	} 
}; 

void std_sort(std::list&lt;int&gt; l) {
	std::vector&lt;int&gt; v(l.begin(), l.end());
	std::sort(v.begin(), v.end());
	l.assign(v.begin(), v.end());
}

void std_list_sort(std::list&lt;int&gt; l) {
	l.sort();
}

void my_list_sort(LinkedList&lt;int&gt; l) {
	l.sort();	
}

int main() { 
    srand(time(NULL)); 

    std::list&lt;int&gt; list;
	LinkedList&lt;int&gt; mylist; 

	int r = 0;
    for (int i = 0; i &lt; 1000000; ++i) {
		r = rand();
        list.push_back(r);
		mylist.append(r);		   
	} 

    Timer t1; 

    t1.start(); 
	std_sort(list); 
    t1.stop(); 
    std::cout &lt;&lt; &quot;Sorting time using std::sort: &quot; &lt;&lt; t1.diff() &lt;&lt; &quot; ms\n&quot;; 

    t1.start(); 
	std_list_sort(list);
    t1.stop(); 
    std::cout &lt;&lt; &quot;Sorting time using std::list::sort: &quot; &lt;&lt; t1.diff() &lt;&lt; &quot; ms\n&quot;; 

	t1.start(); 
	my_list_sort(mylist);
	t1.stop(); 
        std::cout &lt;&lt; &quot;Sorting time using my own list: &quot; &lt;&lt; t1.diff() &lt;&lt; &quot; ms\n&quot;;
    return EXIT_SUCCESS; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1244258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1244258</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Mon, 12 Mar 2007 19:20:44 GMT</pubDate></item></channel></rss>