<?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[Zahlen sortieren]]></title><description><![CDATA[<p>Hallo !</p>
<p>Es geht um folgendes:</p>
<p>Ich habe sehr viele (berechnete) Zahlen (doubles), von denen ich die kleinste und die größte benötige (und eventuell auch noch die Summe aller berechneten Zahlen (ist immer kleiner als 100000))<br />
Bisher habe ich alle Zahlen in einen STL Container (Vector) geschrieben, dann sortiert und mir danach die erste und letzte Zahl ausgeben lassen sowie (falls nötig) mit dem accumulate Algorithmus die Summe berechnet.<br />
Nun habe ich zwei Fragen:<br />
1. Gibt es irgendwelche Beschränkungen, die ich hier beachten muß ?<br />
Ab und zu bekomme ich schon mal einen Memory Error, obwohl der Speicher meines<br />
Rechners bei weitem nicht voll ist (grade mal 10%) !?<br />
2. Könnte ich Rechenzeit sparen, wenn ich dieselbe Aufgabe anders programmieren würde ?<br />
(Wenn ja, wie ?)</p>
<p>Vielen Dank für Eure 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/topic/218995/zahlen-sortieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 07:57:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218995.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Jul 2008 13:41:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 13:45:14 GMT]]></title><description><![CDATA[<p>Hallo !</p>
<p>Es geht um folgendes:</p>
<p>Ich habe sehr viele (berechnete) Zahlen (doubles), von denen ich die kleinste und die größte benötige (und eventuell auch noch die Summe aller berechneten Zahlen (ist immer kleiner als 100000))<br />
Bisher habe ich alle Zahlen in einen STL Container (Vector) geschrieben, dann sortiert und mir danach die erste und letzte Zahl ausgeben lassen sowie (falls nötig) mit dem accumulate Algorithmus die Summe berechnet.<br />
Nun habe ich zwei Fragen:<br />
1. Gibt es irgendwelche Beschränkungen, die ich hier beachten muß ?<br />
Ab und zu bekomme ich schon mal einen Memory Error, obwohl der Speicher meines<br />
Rechners bei weitem nicht voll ist (grade mal 10%) !?<br />
2. Könnte ich Rechenzeit sparen, wenn ich dieselbe Aufgabe anders programmieren würde ?<br />
(Wenn ja, wie ?)</p>
<p>Vielen Dank für Eure 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/1555033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555033</guid><dc:creator><![CDATA[cplusplus_anfaenger]]></dc:creator><pubDate>Mon, 28 Jul 2008 13:45:14 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 13:45:00 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/algorithm/min_element.html" rel="nofollow">min_element</a><br />
<a href="http://www.cplusplus.com/reference/algorithm/max_element.html" rel="nofollow">max_element</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555036</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 28 Jul 2008 13:45:00 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 13:50:02 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Wieso bin ich da eigentlich nicht selber darauf gekommen ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Und wie sieht das mit der Summation aus, kann man da die Rechenzeit noch irgendwie verringern ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555039</guid><dc:creator><![CDATA[cplusplus_anfaenger]]></dc:creator><pubDate>Mon, 28 Jul 2008 13:50:02 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 13:55:30 GMT]]></title><description><![CDATA[<p>Wenn du wirklich nur die kleinste, die größte und die Summe brauchst, warum schreibst du die Zahlen dann überhaupt in einen Vector, und bearbeitest das nicht, wenn die Zahlen anfallen? Von woher schreibst du die Zahlen in den Vector? Die Algorithmen der Standardbibliothek arbeiten auch auf ganz gewöhnlichen Arrays.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555042</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Mon, 28 Jul 2008 13:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 14:08:16 GMT]]></title><description><![CDATA[<p>Es gibt auch den STL-Container <code>std::set</code> , der die Daten gerade sortiert abspeichert.</p>
<p>Oder du nimmst <code>std::valarray</code> mit der eingebauten Funktion <code>sum()</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555052</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 28 Jul 2008 14:08:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 14:10:58 GMT]]></title><description><![CDATA[<p>Wenn du nur die kleinste und die größte Zahl brauchst dann brauchst du keineswegs den Vektor sortieren.</p>
<pre><code class="language-cpp">double *Array;
// sagen wir mal das Array ist gefüllt und besitzt die Länge N
double min = Array[0];
double max = Array[0];

for ( int i = 1; i &lt; N; ++i )
{
    if ( Array[ i ] &lt; min )
        min = Array[ i ];
    if ( Array[ i ] &gt; max )
        max = Array[ i ];
}

// falls du noch den Index der Min und Max-Elemente benötigst, musst du halt 
// noch den Index i speichern.
</code></pre>
<p>Ich denke es ist ganz gut wenn er das mal selbst programmiert und nicht gleich von Anfang an von der STL bemuttert wird <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/1555054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555054</guid><dc:creator><![CDATA[It0101]]></dc:creator><pubDate>Mon, 28 Jul 2008 14:10:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 14:16:40 GMT]]></title><description><![CDATA[<p>Aber bei arrays muß immer die Länge vorher feststehen. Da ich aber nicht weiß wieviele Zahlen ich jeweils habe, woraus ich min, max und eventuell Summe bestimmen muß, kann ich arrays hier nicht verwenden, oder ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555060</guid><dc:creator><![CDATA[cplusplus_anfaenger]]></dc:creator><pubDate>Mon, 28 Jul 2008 14:16:40 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 14:17:09 GMT]]></title><description><![CDATA[<p>It0101 schrieb:</p>
<blockquote>
<p>Wenn du nur die kleinste und die größte Zahl brauchst dann brauchst du keineswegs den Vektor sortieren.</p>
<pre><code class="language-cpp">double *Array;
// sagen wir mal das Array ist gefüllt und besitzt die Länge N
double min = Array[0];
double max = Array[0];

for ( int i = 1; i &lt; N; ++i )
{
    if ( Array[ i ] &lt; min )
        min = Array[ i ];
    if ( Array[ i ] &gt; max )
        max = Array[ i ];
}

// falls du noch den Index der Min und Max-Elemente benötigst, musst du halt 
// noch den Index i speichern.
</code></pre>
<p>Ich denke es ist ganz gut wenn er das mal selbst programmiert und nicht gleich von Anfang an von der STL bemuttert wird <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>Nur leider läuft das mit O(N), was bei &quot;sehr vielen&quot; Zahlen wohl nicht ausreichend ist.</p>
<p>Wie schaut's mit PriorityQueues oder ggf. zwei Heaps (natürlich jeweils &quot;invers&quot; zum anderen) aus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555062</guid><dc:creator><![CDATA[nur halb gelesen]]></dc:creator><pubDate>Mon, 28 Jul 2008 14:17:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 14:29:36 GMT]]></title><description><![CDATA[<p>@ Nexus</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Es gibt auch den STL-Container <code>std::set</code> , der die Daten gerade sortiert abspeichert.</p>
</blockquote>
<p>Aber ich vermute mal, dass die Rechenzeit bei min_element und max_element auf einem Vector angewendet geringer ist, denn wenn ich set verwende wird ja wieder alles sortiert und das kostet Rechenzeit.<br />
Oder ? <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="🙂"
    /> Bin ja kein Experte <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/1555068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555068</guid><dc:creator><![CDATA[cplusplus_anfaenger]]></dc:creator><pubDate>Mon, 28 Jul 2008 14:29:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 14:27:36 GMT]]></title><description><![CDATA[<p>Die Anzahl der Zahlen (N) variiert übrigens und liegt jeweils zwischen 1 und 300 Millionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555076</guid><dc:creator><![CDATA[cplusplus_anfaenger]]></dc:creator><pubDate>Mon, 28 Jul 2008 14:27:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 14:31:20 GMT]]></title><description><![CDATA[<p>cplusplus_anfaenger schrieb:</p>
<blockquote>
<p>@ Nexus</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Es gibt auch den STL-Container <code>std::set</code> , der die Daten gerade sortiert abspeichert.</p>
</blockquote>
<p>Aber ich vermute mal, dass die Rechenzeit bei min_element und max_element geringer ist, denn wenn ich set verwende wird ja wieder alles sortiert wird und das kostet Rechenzeit. Oder ? <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="🙂"
    /> Bin ja kein Experte <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>
</blockquote>
<p>Nein, <code>std::set</code> speichert die Daten nicht linear (sprich Array), sondern meistens in einem Binärbaum ab. Das ist wesentlich performanter, da nicht die ganze Sequenz neu geordnet werden muss. Beim Einfügen eines neuen Elements wird automatisch geschaut, dass es an die richtige Stelle kommt.</p>
<p>Falls du aber sehr viele Einfügungen hast und vergleichsweise selten das Minimum/Maximum benötigst, lohnt sich evtl. ein linearer Container mehr. Wobei man dann wieder bedenken sollte, dass <code>min_element</code> bzw. <code>max_element</code> bei sequenziellen Containern in O(n) läuft, während es im Set nur O(1), also konstante Zeit benötigt (entweder Anfang oder Ende).</p>
<p>Du musst natürlich auch beachten, ob dein Container noch andere Bedingungen erfüllen soll (z.B. Random Access). Und was die Summe betrifft, die ist wohl überall linear. Oder du addierst beim Einfügen eines neuen Elementes den neuen Wert zu einer eigenen, separaten Variable, sodass du da auch konstante Zugriffszeit hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555078</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 28 Jul 2008 14:31:20 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 14:57:09 GMT]]></title><description><![CDATA[<p>[quote=&quot;nur halb gelesen&quot;]</p>
<p>It0101 schrieb:</p>
<blockquote>
<p>Wie schaut's mit PriorityQueues oder ggf. zwei Heaps (natürlich jeweils &quot;invers&quot; zum anderen) aus?</p>
</blockquote>
<p>Ich gebe diese Frage mal an die Experten weiter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>(Also im Detail sieht der Ablauf meines Teilprogrammes (innerhalb eines Loops) so aus:<br />
Ich bekomme Zahlen (doubles, und zwar eine bis maximal etwa 300 Millionen davon), davon benoetige ich die größte Zahl,kleinste Zahl, die Summe der Zahlen und N (Anzahl der erhaltenen Zahlen) und auch noch die kleinsten Zahlen aus Teilmengen, wenn man die Menge aus N Zahlen so wie sie kommen in Teilmengen aus (Wurzel aus N) Zahlen aufteilt (N ist Quadratzahl,also funktioniert das).)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555092</guid><dc:creator><![CDATA[cplusplus_anfaenger]]></dc:creator><pubDate>Mon, 28 Jul 2008 14:57:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 15:05:54 GMT]]></title><description><![CDATA[<p>Also wie geht das nun am schnellsten ?</p>
<p>a) array<br />
b) Vector, min_element/max_element<br />
c) Set<br />
d) PriorityQueues<br />
e) Heaps<br />
f) Noch etwas anderes <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p><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/1555096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555096</guid><dc:creator><![CDATA[cplusplus_anfaenger]]></dc:creator><pubDate>Mon, 28 Jul 2008 15:05:54 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Mon, 28 Jul 2008 15:45:31 GMT]]></title><description><![CDATA[<p>cplusplus_anfaenger schrieb:</p>
<blockquote>
<p>f) Noch etwas anderes <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>
</blockquote>
<p>einen eigenen &quot;container&quot; schreiben der die elemnte nicht einfügt, sondern nur zur berechnung von min, max und sum verwendet:</p>
<p>ein push_back würde zB so aussehen:</p>
<pre><code class="language-cpp">void push_back(value_type const&amp; value) {
  if(value&lt;min) min = value;
  if(value&gt;max) max = value;
  sum += value;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1555110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555110</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 28 Jul 2008 15:45:31 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Wed, 30 Jul 2008 11:16:21 GMT]]></title><description><![CDATA[<p>Bei der Anzahl von Werten (300 Millionen) würde ich dir, je nach Beschaffenheit der Zahlen und einen Anforderungen an die Genauigkeit, den Kahan-Summierungsalgorithmus empfehlen:<br />
<a href="http://en.wikipedia.org/wiki/Kahan_summation_algorithm" rel="nofollow">http://en.wikipedia.org/wiki/Kahan_summation_algorithm</a></p>
<p>Bei doubles reicht oft die Genauigkeit aus. Aber du kannst ja mal ausprobieren, ob es in deinem Fall etwas ausmacht und ob du die Präzision wirklich brauchst (drückt natürlich auch die Performance, das muss auch als Gegenargument mit einfließen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556177</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Wed, 30 Jul 2008 11:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Thu, 31 Jul 2008 13:45:59 GMT]]></title><description><![CDATA[<blockquote>
<p>Bei doubles reicht oft die Genauigkeit aus. Aber du kannst ja mal ausprobieren, ob es in deinem Fall etwas ausmacht und ob du die Präzision wirklich brauchst</p>
</blockquote>
<p>Naja, ich &quot;bekomme&quot; doubles, wenn ich mit floats weiterrechnen wollte müßte ich die doubles erst alle &quot;casten&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557058</guid><dc:creator><![CDATA[cplusplus_anfaenger]]></dc:creator><pubDate>Thu, 31 Jul 2008 13:45:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zahlen sortieren on Thu, 31 Jul 2008 19:03:58 GMT]]></title><description><![CDATA[<p>cplusplus_anfaenger schrieb:</p>
<blockquote>
<blockquote>
<p>Bei doubles reicht oft die Genauigkeit aus. Aber du kannst ja mal ausprobieren, ob es in deinem Fall etwas ausmacht und ob du die Präzision wirklich brauchst</p>
</blockquote>
<p>Naja, ich &quot;bekomme&quot; doubles, wenn ich mit floats weiterrechnen wollte müßte ich die doubles erst alle &quot;casten&quot;</p>
</blockquote>
<p>Hmm... Das hatte er nicht gemeint (double ist genauer als float)<br />
Er meinte, du sollst das, was du da rechnest ma iwo nachrechnen (taschenrechner oder so ^^ (und 300 Millionen Zahlen addieren xD) ) - keine Ahnung, wie ^^ Wenn die Abweichung dir zu groß ist, dann musst du dir irgend ne Lib für große Zahlen suchen...<br />
Wenn du 300 Millionen doubles 'einfach' addierst wird es schon nen extrem große standard-abweichung geben - aber da haste ja auch scho nen tollen link bekommen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557211</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 31 Jul 2008 19:03:58 GMT</pubDate></item></channel></rss>