<?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[Algorithmen Geeks aufgepasst, Denksportaufgabe!]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein sortiertes Integer Feld (Array) der länge d und eine zusätzliche Integer Variable i. Zusätzlich habe ich ein leeres Ausgabefeld feld2 mit derselben Länge d.<br />
Die Ausgangssituation (mit Länge d=4) sieht so aus:</p>
<pre><code class="language-cpp">//Situation vor Algorithmus

int feld1[4] = { 10, 20, 30, 40 };

int i = 12;

int feld2[4] = { 0, 0, 0, 0 };
</code></pre>
<p>Nun suche ich einen Algorithmus der<br />
[<em>]Die Zahlen des Feldes zusammen mit der Variablen in eine sortierte Liste der Länge d+1 überführt<br />
[</em>]Die Liste in der Mitte teilt<br />
[<em>]Die unteren d/2 Werte im Eingabefeld feld1 belässt<br />
[</em>]Die oberen d/2 Werte in das Ausgabefeld feld2 schreibt<br />
[*]Den mittleren Wert (M) in die Variable i schreibt</p>
<pre><code class="language-cpp">Sortierte Liste erstellen: 10, 12, 20, 30, 40 
                                   ^
                          |-d/2-|  M  |-d/2-|

                           feld1   i   feld2
</code></pre>
<p>Das Ergebnis sieht dann so aus:</p>
<pre><code class="language-cpp">//Ergebnis nach Algorithmus

feld1 = { 10, 12, 0, 0 };
feld2 = { 30, 40, 0, 0 };
i == 20;                     //True
</code></pre>
<p>Um die Sache möglichst performant zu gestalten hätte ich gerne, dass der Algorithmus ortsfest (inplace, in-situ) arbeitet, d.h. das kein zusätzliches Feld der Länge d+1 allokiert wird um die Daten aus feld1 und i zu sortieren.</p>
<p>Habt Ihr dazu eine Idee?</p>
<p>Gruß,<br />
B!</p>
<p>P.S.: Die Frage stellt sich im Rahmen der Implementierung eines B+ Baums. Wer das schon einmal gemacht hat sollte u.U. bereits über dieses Problem gestolpert sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263917/algorithmen-geeks-aufgepasst-denksportaufgabe</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 12:03:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263917.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Mar 2010 20:41:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Mon, 29 Mar 2010 20:41:52 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein sortiertes Integer Feld (Array) der länge d und eine zusätzliche Integer Variable i. Zusätzlich habe ich ein leeres Ausgabefeld feld2 mit derselben Länge d.<br />
Die Ausgangssituation (mit Länge d=4) sieht so aus:</p>
<pre><code class="language-cpp">//Situation vor Algorithmus

int feld1[4] = { 10, 20, 30, 40 };

int i = 12;

int feld2[4] = { 0, 0, 0, 0 };
</code></pre>
<p>Nun suche ich einen Algorithmus der<br />
[<em>]Die Zahlen des Feldes zusammen mit der Variablen in eine sortierte Liste der Länge d+1 überführt<br />
[</em>]Die Liste in der Mitte teilt<br />
[<em>]Die unteren d/2 Werte im Eingabefeld feld1 belässt<br />
[</em>]Die oberen d/2 Werte in das Ausgabefeld feld2 schreibt<br />
[*]Den mittleren Wert (M) in die Variable i schreibt</p>
<pre><code class="language-cpp">Sortierte Liste erstellen: 10, 12, 20, 30, 40 
                                   ^
                          |-d/2-|  M  |-d/2-|

                           feld1   i   feld2
</code></pre>
<p>Das Ergebnis sieht dann so aus:</p>
<pre><code class="language-cpp">//Ergebnis nach Algorithmus

feld1 = { 10, 12, 0, 0 };
feld2 = { 30, 40, 0, 0 };
i == 20;                     //True
</code></pre>
<p>Um die Sache möglichst performant zu gestalten hätte ich gerne, dass der Algorithmus ortsfest (inplace, in-situ) arbeitet, d.h. das kein zusätzliches Feld der Länge d+1 allokiert wird um die Daten aus feld1 und i zu sortieren.</p>
<p>Habt Ihr dazu eine Idee?</p>
<p>Gruß,<br />
B!</p>
<p>P.S.: Die Frage stellt sich im Rahmen der Implementierung eines B+ Baums. Wer das schon einmal gemacht hat sollte u.U. bereits über dieses Problem gestolpert sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875220</guid><dc:creator><![CDATA[BitShift]]></dc:creator><pubDate>Mon, 29 Mar 2010 20:41:52 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Mon, 29 Mar 2010 21:53:38 GMT]]></title><description><![CDATA[<p>Das soll jetzt ein Witz sein oder?</p>
<p>Klärt mich bitte auf....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875251</guid><dc:creator><![CDATA[Croatiancow]]></dc:creator><pubDate>Mon, 29 Mar 2010 21:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Mon, 29 Mar 2010 22:01:50 GMT]]></title><description><![CDATA[<p>Suche mittels binärer Suche oder Interpolationssuche die Stelle, an die das i gehört. Dann brauchst du nur noch sowas Ähnliches wie das hier (ungetestet, die Position für i hab ich pos genannt):</p>
<pre><code class="language-cpp">int limit = max(d/2, pos);
copy(feld1 + limit, feld1 + d, feld2 + limit - d/2);

if(pos &gt; d/2)
	copy(feld1 + d/2 + 1, feld1 + pos, feld2);
else
{
	copy_backward(feld1 + pos, feld1 + d/2, feld1 + d/2 + 1);
	feld1[pos] = i;
}

i = feld1[d/2];
fill(feld1 + d/2, feld1 + d, 0);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1875255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875255</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 29 Mar 2010 22:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Mon, 29 Mar 2010 23:39:53 GMT]]></title><description><![CDATA[<p>Hier mal ne quick'n'dirty-Lösung &quot;mit der Hand am Arm&quot; wie mein Mathelehrer immer so schön gesagt hat <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>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;iostream&gt;
#include &lt;conio.h&gt;
#include &lt;cassert&gt;

int main()
{
	const int d = 8;

	int t1[d] = { 10, 15, 18, 20, 26, 35, 47, 54 };

	std::vector&lt;int&gt; feld1( t1, t1+d ), feld2( d, 0 );

	int val;

	std::cin &gt;&gt; val;

	// Da du eh mindestens d/2-1 Elemente von feld1 nach feld2
	// kopieren musst kannst du val auch &quot;auf dem Weg suchen&quot;
	// Du solltest dir aber überlegen was das Verfahren in dem Fall
	// machen soll das val bereits in feld1 vorhanden ist.

	//ich arbeite hier mit schritthaltenden iteratoren
	std::vector&lt;int&gt;::reverse_iterator it1 = feld1.rbegin(),
		it2( std::vector&lt;int&gt;::iterator( &amp;feld2[ d/2 ], &amp;feld2 ) ),
		tmp_it;

	bool val_inserted = false;

	while( it2 != feld2.rend() )
	{
		// wenn val größer ist als der nächste zu kopierende
		// Wert nimmt val seinen Platz ein
		if( val &gt; *it1 &amp;&amp; !val_inserted )
		{
			*it2 = val;
			++it2;
			val_inserted = true;
		}
		// val ist kleiner als der nächste zu kopierende Wert
		// der Wert wird kopiert
		else if( val &lt; *it1 || val_inserted )
		{
			*it2 = *it1;
			++it1;
			++it2;
		}
		else // Wenn ich das korrekt durchgedacht hab müsste val an
			 // dieser Stelle weder kleiner noch größer als nächste
			 // zu kopierende Wert sein, also gleich
		{
			assert( 0 );
		}
	}

	// wenn val bereits eingefügt wurde wird
	// der nächste zu kopierende Wert das neue val
	// An dieser Stelle wären wir dann fertig da
	// die restlichen Werte in feld1 verbleiben
	if( val_inserted )
	{
		val = *it1;
	}
	else
		if( val &gt; *it1 ); //val ist größer als der größte verbleibende Wert
						  //in feld1, also bleibt val val
	else // val wurde noch nicht eingefügt
	{
		int nval = *it1; // Das größte verbleibende Element wird auf alle
						 // Fälle das neue val

		// Diesmal gehen wir bis zum 'vorletzten' Element, also bis begin
		std::vector&lt;int&gt;::reverse_iterator begin = feld1.rend();
		--begin;

		while( it1 != begin )
		{
			// Ablauf ähnlich wie oben
			if( val &lt; *it1 )
			{
				tmp_it = it1;
				*tmp_it = *(++it1);
			}
			else if( val &gt; *it1 ) break;
			else
			{
				assert( 0 ); // val ist bereits in feld1 vorhanden
			}
		}

		*it1 = val;
		val = nval;
	}

	_getch();

	return 0;
</code></pre>
<p>Das Nullen von feld1 hab ich mal weggelassen weil das für deinen Anwendungsfall eigentlich unnötig ist.</p>
<p>Das ist vielleicht minimal schneller als die Lösung von Michael weil du dir die binäre Suche sparst.<br />
Ich würde aber die Lösung von Michael bevorzugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875287</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Mon, 29 Mar 2010 23:39:53 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Mon, 29 Mar 2010 23:51:25 GMT]]></title><description><![CDATA[<p>Die Stelle an die das &quot;i&quot; gehört kann man auch hübsch suchen, während man Elemente kopiert. Natürlich muss dazu selbst etwas mehr Code schreiben, und kann nichtmehr so schön std::copy etc. verwenden.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13869">@rean</a>:<br />
Sehr D auf jeden Fall, ja <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="😃"
    /><br />
Man kann das auch viel schöner z.B. mit einem Method-Object lösen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875290</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 29 Mar 2010 23:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Tue, 30 Mar 2010 00:06:51 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Die Stelle an die das &quot;i&quot; gehört kann man auch hübsch suchen, während man Elemente kopiert. Natürlich muss dazu selbst etwas mehr Code schreiben, und kann nichtmehr so schön std::copy etc. verwenden.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13869">@rean</a>:<br />
Sehr D auf jeden Fall, ja <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="😃"
    /><br />
Man kann das auch viel schöner z.B. mit einem Method-Object lösen.</p>
</blockquote>
<p>Zu meiner Verteidigung: Es ist spät und ich sollte eigentlich lernen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
Die Lösung mit dem Method-Object würde mich interessieren, willste da mal nen Schnipsel posten?</p>
<p>Für den hier gegebenen Anwendungsfall dürfte es aber sinnvoll sein im Voraus zu gucken ob der neue Wert nicht schon vorhanden ist weil man sich dann das komplette splitten sparen kann. Und dann wären beide Lösungen gleichwertig, außer dass die von Michael viel weniger Programmierarbeit ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875296</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Tue, 30 Mar 2010 00:06:51 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Tue, 30 Mar 2010 02:19:01 GMT]]></title><description><![CDATA[<p>Inetwa so z.B.:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cassert&gt;

template &lt;class T&gt;
T insert_split(T* page1, T* page2, size_t pageSize, T newElement)
{
	struct method_object
	{
		T* const page1;
		T* const page2;
		size_t const pageSize;

		T* next_output_ptr; // where the next element shall go
		T* output_segment_back_ptr; // the last position in the current output segment that we can write to (NOT one-past-last!)

		T run(T const&amp; newElement)
		{
			// setup first output segment
			next_output_ptr = page1;
			output_segment_back_ptr = final_page1_back_ptr();

			assert(pageSize &gt;= 2);

			T buffer = page1[0];
			bool newElementInserted = false;

			for (size_t i = 0; i &lt; pageSize; i++)
			{
				T const current = buffer;

				// if there is another element after &quot;current&quot;,
				// we have to buffer it, because writing the current element
				// could overwrite it, if the new element is inserted anywhere in page1
				if ((i + 1) &lt; pageSize)
					buffer = page1[i + 1];

				// emit the new element before &quot;current&quot;, if &quot;current&quot; is bigger
				if ((!newElementInserted) &amp;&amp; current &gt; newElement)
				{
					emit(newElement);
					newElementInserted = true;
				}

				// emit the &quot;current&quot; element
				emit(current);
			}

			// if the new element goes in last, it hasn't been emitted yet
			if (!newElementInserted)
				emit(newElement);

			// return the new middle element
			return *final_middle_element_ptr();
		}

		void emit(T const&amp; element)
		{
			*next_output_ptr = element;

			// check if the current output segment is full, and switch to the next one if necessary
			if (next_output_ptr == output_segment_back_ptr)
			{
				if (output_segment_back_ptr == final_page1_back_ptr())
				{
					// switch from segment 1 (page1) to segment 2 (middle element)
					next_output_ptr = final_middle_element_ptr();
					output_segment_back_ptr = next_output_ptr; // only one element
				}
				else if (output_segment_back_ptr == final_middle_element_ptr())
				{
					// switch from segment 2 (middle element) to segment 3 (page2)
					next_output_ptr = page2;
					output_segment_back_ptr = page2 + final_page2_size();
					// NOTE: this is actually the &quot;end&quot; position (=one-past-last),
					//       but that's the easiest way to not trigger the assert below
					//       when the last element is being emitted
				}
				else
					assert(0 &amp;&amp; &quot;logic error :(&quot;);
			}
			else
				next_output_ptr++;
		}

		// the final size of page1
		size_t final_page1_size() const { return (pageSize + 1) / 2; }

		// the final size of page2
		size_t final_page2_size() const { return pageSize - final_page1_size(); }

		// the position of the last element in page1
		T* final_page1_back_ptr() const { return page1 + (final_page1_size() - 1); }

		// pointer to where the new middle element shall be stored after we're done
		// NOTE: we use the space after the last used element of page2.
		//       of course we could also use an extra variable of type T instead.
		T* final_middle_element_ptr() const { return page2 + final_page2_size(); }

	}
		mo = { page1, page2, pageSize };

	return mo.run(newElement);
}

/////////////////////////////////////////////////////////////////////////////
// test code
/////////////////////////////////////////////////////////////////////////////

template &lt;class T&gt;
void dump(T* page1, T* page2, size_t pageSize, T middleElement)
{
	for (size_t i = 0; i &lt; pageSize; i++)
	{
		std::cout &lt;&lt; page1[i];
		if ((i + 1) &lt; pageSize)
			std::cout &lt;&lt; &quot;, &quot;;
	}

	std::cout &lt;&lt; &quot;\n&quot; &lt;&lt; middleElement &lt;&lt; &quot;\n&quot;;

	for (size_t i = 0; i &lt; pageSize; i++)
	{
		std::cout &lt;&lt; page2[i];
		if ((i + 1) &lt; pageSize)
			std::cout &lt;&lt; &quot;, &quot;;
	}

	std::cout &lt;&lt; &quot;\n\n&quot;;
}

template &lt;class T&gt;
void test(T e1, T e2, T e3, T e4, T newElement)
{
	T page1[4] = { e1, e2, e3, e4 };
	T page2[4] = { T(), T(), T(), T() };

	dump(page1, page2, 4, newElement);

	T middle = insert_split(page1, page2, 4, newElement);

	dump(page1, page2, 4, middle);

	std::cout &lt;&lt; &quot;--------------------------\n&quot;;
}

int main()
{
	// in page 1
	test(10, 20, 30, 40, 12);

	// in page 2
	test(10, 20, 30, 40, 35);

	// first
	test(10, 20, 30, 40, 5);

	// last
	test(10, 20, 30, 40, 50);

	return 0;
}
</code></pre>
<p>Sieht jetzt mächtig riesig aus, aber wenn man den Test-Code und die Kommentare wegnimmt, dann ist es eigentlich recht schlank.</p>
<p>Die Funktion geht &quot;page1&quot; genau 1x durch (jedes Element wird 1x gelesen), und zwar in vorwärts Richtung. Verglichen wird während des Kopierens. Und kopiert (geschrieben) wird auch immer in vorwärts Richtung.</p>
<p>Wenn das Kopieren von Elementen relativ teuer ist, liesse sich die Funktion relativ einfach umbauen so dass ...<br />
* Elemente nicht &quot;auf sich selbst&quot; kopiert werden<br />
* Elemente ausschliesslich mit swap()/move() getauscht/bewegt werden</p>
<p>Hab ich mir der Einfachkeit halber mal gespart.</p>
<p>p.S.: mir ist durchaus klar, dass man ein paar Dinge einfacher schreiben könnte, wenn man davon ausgeht dass die Page-Grösse immer durch 2 teilbar ist. Und dass es für B-Bäume kaum Sinn macht, eine nicht durch 2 teilbare Grösse zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875299</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 30 Mar 2010 02:19:01 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Tue, 30 Mar 2010 02:50:33 GMT]]></title><description><![CDATA[<p>p.p.S.: ich denke auch dass &quot;meine&quot; Variante kaum jemals schneller sein wird als die einfache Suchen + Kopieren Variante. Ganz einfach weil die Kopierschleife in &quot;meiner&quot; Variante wesentlich komplizierter ist. Was vermutlich schwerer wiegt als der extra Such-Durchgang bzw. das Rückwärts-Kopieren in der Suchen + Kopieren Variante. Speziell wenn man binär such, und die Daten vor dem Funktionsaufruf schon im Cache stehen (was wohl oft der Fall sein wird).</p>
<p>Der (theoretische) Vorteil wäre, dass alle Daten sequentiell verarbeitet werden, also kein Random-Access und kein rückwärts Kopieren. Würde vielleicht was bringen wenn man grosse Datenmengen direkt von HDD zu HDD kopiert, aber mit ein paar wenigen tausend Integers im RAM wohl eher nicht.</p>
<p>Und der Vorteil den ich in der Verwendung eines Method-Objects sehe, ist, dass alles viel übersichtlicher wird. Auch wenn man im Endeffekt ein paar Zeilen mehr schreibt/liest. Man muss sich nur mal ansehen wie kurz und gut verständlich die Kopier-Schleife wird.</p>
<p>------</p>
<p>Achja, nochwas: wenn man in Kauf nimmt dass page1 und page2 nach dem Aufruf von insert_split vertauscht sind, kann man sich natürlich das &quot;Puffern&quot; des nächsten Elements sparen - man schreibt ja dann zuerst nach page2, und es besteht nie die Chance dass man das als nächstes zu bearbeitende Element in page1 überschreibt.</p>
<p>Dadurch würde die Kopierschleife deutlich einfacher.</p>
<p>Und wenn man davon ausgeht, dass der Compiler gut Inlining betreibt, könnte es noch was bringen, denn äusseren &quot;else&quot; Zweig in &quot;emit()&quot; zu eliminieren, und &quot;next_output_ptr++&quot; unconditional auszuführen. Spart dann einen Sprung, und sollte sich leicht machen lassen.</p>
<p>Allerdings schätze ich, dass selbst mit diesen Änderungen &quot;meine&quot; Variante noch nicht schneller sein wird, als die Suchen + Kopieren Variante.</p>
<p>Um das auszuprobieren ist es mir aber jetzt schon zu spät *schnurch*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875300</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 30 Mar 2010 02:50:33 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Tue, 30 Mar 2010 06:38:03 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich bin echt platt! Ihr habt Euch gestern Nacht noch mächtig ins Zeug gelegt! Ich schaue mir Eure Lösungsvorschläge in Ruhe an und melde mich dann wieder bei Euch.</p>
<p>Gruß,<br />
B!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875319</guid><dc:creator><![CDATA[BitShift]]></dc:creator><pubDate>Tue, 30 Mar 2010 06:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Tue, 30 Mar 2010 09:02:49 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main()
{
    const int size = 4;
    int feld1[size] = {10, 20, 30, 40};
    int feld2[size] = {0};
    int i = 12;

    for(int k = 0; k &lt; size; ++k) if (i &lt; feld1[k]) swap(&amp;i,&amp;feld1[k]);
    for(int k = size/2+1, l = 0; k &lt; size; ++k, ++l) feld2[l] = feld1[k];
    feld2[size/2-1] = i;
    i = feld1[size/2];
    // set to zeros
    for(int k = size/2; k&lt; size; ++k) feld1[k] = 0;

    // testing

    // printing
    std::cout &lt;&lt; &quot;feld1: &quot;;
    for(int l = 0; l &lt; size; ++l)
    {
        std::cout &lt;&lt; feld1[l] &lt;&lt; &quot; &quot;;
    }
    std::cout &lt;&lt; std::endl;

    std::cout &lt;&lt; &quot;feld2: &quot;;
    for(int l = 0; l &lt; size; ++l)
    {
        std::cout &lt;&lt; feld2[l] &lt;&lt; &quot; &quot;;
    }
    std::cout &lt;&lt; std::endl &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; std::endl;

    return 0;
}
</code></pre>
<p>5 Zeilen Code in C++. Das kan man gerne auch noch in Templates packen. Man braucht nur eine swap- und eine Vergleichsfunktion. Aufpassen muss man nur, falls die Laenge der Ausgangsarrays ungerade ist. Alle anderen vorgestellten Loesungen sind mir zu kompliziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875358</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 30 Mar 2010 09:02:49 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Tue, 30 Mar 2010 10:53:43 GMT]]></title><description><![CDATA[<p>Hihi, sehr elegant.<br />
Damit schlägst du vermutlich auch die Suchen + Kopieren Variante <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/1875408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875408</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 30 Mar 2010 10:53:43 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Tue, 30 Mar 2010 10:58:51 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>5 Zeilen Code in C++.</p>
</blockquote>
<p>Bei vernüftiger Einrückung wären es mindestens 10. <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="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875411</guid><dc:creator><![CDATA[Anti-Obfuscator]]></dc:creator><pubDate>Tue, 30 Mar 2010 10:58:51 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Tue, 30 Mar 2010 11:54:06 GMT]]></title><description><![CDATA[<p>Anti-Obfuscator schrieb:</p>
<blockquote>
<p>knivil schrieb:</p>
<blockquote>
<p>5 Zeilen Code in C++.</p>
</blockquote>
<p>Bei vernüftiger Einrückung wären es mindestens 10. <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="🙄"
    /></p>
</blockquote>
<p>Das sehe ich auch so.<br />
Trotzdem finde ich den Code sehr elegant (abgesehen von der Formatierung).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875451</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 30 Mar 2010 11:54:06 GMT</pubDate></item><item><title><![CDATA[Reply to Algorithmen Geeks aufgepasst, Denksportaufgabe! on Tue, 30 Mar 2010 13:23:26 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main()
{
    const int size = 4;
    int feld1[size] = {10, 20, 30, 40};
    int feld2[size] = {0};
    int i = 12;

    for(int k = 0; k &lt; size; ++k) if (i &lt; feld1[k]) swap(&amp;i,&amp;feld1[k]);
    for(int k = size/2+1, l = 0; k &lt; size; ++k, ++l) feld2[l] = feld1[k];
    feld2[size/2-1] = i;
    i = feld1[size/2];
    // set to zeros
    for(int k = size/2; k&lt; size; ++k) feld1[k] = 0;

    // testing

    // printing
    std::cout &lt;&lt; &quot;feld1: &quot;;
    for(int l = 0; l &lt; size; ++l)
    {
        std::cout &lt;&lt; feld1[l] &lt;&lt; &quot; &quot;;
    }
    std::cout &lt;&lt; std::endl;

    std::cout &lt;&lt; &quot;feld2: &quot;;
    for(int l = 0; l &lt; size; ++l)
    {
        std::cout &lt;&lt; feld2[l] &lt;&lt; &quot; &quot;;
    }
    std::cout &lt;&lt; std::endl &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; std::endl;

    return 0;
}
</code></pre>
<p>5 Zeilen Code in C++. Das kan man gerne auch noch in Templates packen. Man braucht nur eine swap- und eine Vergleichsfunktion. Aufpassen muss man nur, falls die Laenge der Ausgangsarrays ungerade ist. Alle anderen vorgestellten Loesungen sind mir zu kompliziert.</p>
</blockquote>
<p>Über Eleganz kann man sich streiten, Fakt ist jedoch dass du wesentlich mehr herumkopierst. Bei einfachen ints ist das natürlich egal, bei anderen Typen kanns da schon wieder ganz anders aussehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875497</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Tue, 30 Mar 2010 13:23:26 GMT</pubDate></item></channel></rss>