<?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[Funktion mittels Rekursion: sortMerge(n,a)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende Aufgabe bekommen:</p>
<blockquote>
<p>Es soll eine Funktion erstellt werden, welche Arrays mit dem Verfahren „Sortieren durch<br />
Mischen“ aufsteigend sortiert.<br />
Funktion mittels Rekursion: sortMerge(n,a)<br />
Dabei wird wie folgt vorgegangen:<br />
Falls a maximal ein Element enthält ist man fertig (bereits sortiert)<br />
Ansonsten<br />
Erzeuge 2 passende Arrays b und c<br />
Bilde 2 Hälften des Arrays a und speichere sie in die neuen Arrays b und c<br />
Hinweis:<br />
ein neues Array mit Namen h und m Elementen lässt sich wie folgt erzeugen:<br />
double *h = new double[m];<br />
Der Typ ist hier double; andere Typen analog;<br />
m ist ein Ausdruck/eine Variable vom Typ int.<br />
Mit delete []h kann man es wieder löschen.<br />
Sortiere b und c mit SortMerge<br />
Mische b und c und speichere das Ergebnis in a<br />
Lösche b und c</p>
</blockquote>
<p>Bislang habe ich folgendes Programm dazu erstellt:</p>
<pre><code class="language-cpp">void sortMerge(int n, int *a){
	void merge(int *a1, int l1, int *a2, int l2);
    if (n&gt;1){
        sortMerge(n/2, a);
        sortMerge((n+1) / 2, a + n / 2);
        merge(a, n/2, a + n/2, (n+1) / 2);
    }
}   

void merge(int *a1, int l1, int *a2, int l2){
    int p1 = 0, p2 = 0;
	int temparray[10];
    for (int i = 0; i &lt; l1 + l2; i++){
        if (p1 == l1) 
            temparray[i] = a2[p2++];
        else if (p2 == l2)
            temparray[i] = a1[p1++];
        else if (a1[p1] &gt; a2[p2])
            temparray[i] = a2[p2++];
        else
            temparray[i] = a1[p1++];
    }

    for (int i = 0; i &lt; l1; i++)
        a1[i] = temparray[i];
    for (int i = l1; i &lt; l1 + l2; i++)
        a2[i-l1] = temparray[i];
}
</code></pre>
<p>Ich glaube nur leider, dass das so nicht ganz gewollt war.<br />
Allerdings weiß ich auch nicht, wie das in der Aufgabenstellung wirklich gemeint war.</p>
<p>Kann mir hierbei bitte jemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279769/funktion-mittels-rekursion-sortmerge-n-a</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 10:09:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279769.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Jan 2011 14:28:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion mittels Rekursion: sortMerge(n,a) on Mon, 03 Jan 2011 14:28:39 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende Aufgabe bekommen:</p>
<blockquote>
<p>Es soll eine Funktion erstellt werden, welche Arrays mit dem Verfahren „Sortieren durch<br />
Mischen“ aufsteigend sortiert.<br />
Funktion mittels Rekursion: sortMerge(n,a)<br />
Dabei wird wie folgt vorgegangen:<br />
Falls a maximal ein Element enthält ist man fertig (bereits sortiert)<br />
Ansonsten<br />
Erzeuge 2 passende Arrays b und c<br />
Bilde 2 Hälften des Arrays a und speichere sie in die neuen Arrays b und c<br />
Hinweis:<br />
ein neues Array mit Namen h und m Elementen lässt sich wie folgt erzeugen:<br />
double *h = new double[m];<br />
Der Typ ist hier double; andere Typen analog;<br />
m ist ein Ausdruck/eine Variable vom Typ int.<br />
Mit delete []h kann man es wieder löschen.<br />
Sortiere b und c mit SortMerge<br />
Mische b und c und speichere das Ergebnis in a<br />
Lösche b und c</p>
</blockquote>
<p>Bislang habe ich folgendes Programm dazu erstellt:</p>
<pre><code class="language-cpp">void sortMerge(int n, int *a){
	void merge(int *a1, int l1, int *a2, int l2);
    if (n&gt;1){
        sortMerge(n/2, a);
        sortMerge((n+1) / 2, a + n / 2);
        merge(a, n/2, a + n/2, (n+1) / 2);
    }
}   

void merge(int *a1, int l1, int *a2, int l2){
    int p1 = 0, p2 = 0;
	int temparray[10];
    for (int i = 0; i &lt; l1 + l2; i++){
        if (p1 == l1) 
            temparray[i] = a2[p2++];
        else if (p2 == l2)
            temparray[i] = a1[p1++];
        else if (a1[p1] &gt; a2[p2])
            temparray[i] = a2[p2++];
        else
            temparray[i] = a1[p1++];
    }

    for (int i = 0; i &lt; l1; i++)
        a1[i] = temparray[i];
    for (int i = l1; i &lt; l1 + l2; i++)
        a2[i-l1] = temparray[i];
}
</code></pre>
<p>Ich glaube nur leider, dass das so nicht ganz gewollt war.<br />
Allerdings weiß ich auch nicht, wie das in der Aufgabenstellung wirklich gemeint war.</p>
<p>Kann mir hierbei bitte jemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001753</guid><dc:creator><![CDATA[Thunderstick]]></dc:creator><pubDate>Mon, 03 Jan 2011 14:28:39 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mittels Rekursion: sortMerge(n,a) on Mon, 03 Jan 2011 14:31:49 GMT]]></title><description><![CDATA[<p>Falsches Forum, das gehört ins C++ Forum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001759</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Mon, 03 Jan 2011 14:31:49 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mittels Rekursion: sortMerge(n,a) on Mon, 03 Jan 2011 16:22:41 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/u18363" rel="nofollow">Jochen Kalmbach</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/f58" rel="nofollow">C++/CLI mit .NET</a> in das Forum <a href="http://www.c-plusplus.net/forum/f15" rel="nofollow">C++ (auch C++0x)</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001857</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 03 Jan 2011 16:22:41 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mittels Rekursion: sortMerge(n,a) on Mon, 03 Jan 2011 16:36:02 GMT]]></title><description><![CDATA[<p>Woher kommt die Größe 10 für temparray?</p>
<p>Überhaupt: Kannst du deine Mergefunktion mal kommentieren? Und vermeiden, Variablen l1 oder l2 zu nennen? Das kann kein Mensch unangestrengt von 11 und 12 unterscheiden.</p>
<p>Die Aufgabenstellung verlangt, dass du die Elemente innerhalb deiner sortMergefunktion kopierst. Und das ist auch nicht ganz ohne Sinn.</p>
<p>Müsst ihr das mit new/delete machen? Könnt ihr nicht einfach vector nehmen? Falls new/delete: Benutz hinterher auf jeden Fall einen Speicherdebugger, ob auch alles sauber freigegeben wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001867</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 03 Jan 2011 16:36:02 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mittels Rekursion: sortMerge(n,a) on Mon, 03 Jan 2011 18:52:57 GMT]]></title><description><![CDATA[<p>Habe das nun überarbeitet:</p>
<pre><code class="language-cpp">void sortMerge(int n, int *a){
	void merge(int *a1, int laenge1, int *a2, int laenge2);
    if (n&gt;1) { // Wenn Array mehr als 1 Element enthält
        sortMerge(n/2, a);
        sortMerge((n+1)/2, a + n/2);
        merge(a, n/2, a + n/2, (n+1)/2);
	}
}   

void merge(int *b, int laenge1, int *c, int laenge2){
    int pos1 = 0, pos2 = 0; //Positionen im Array
	int *temparray = new int[laenge1+laenge2];
    for (int i = 0; i &lt; laenge1 + laenge2; i++){
        if (pos1 == laenge1) //erster Array zuende
            temparray[i] = c[pos2++];
        else if (pos2 == laenge2) //zweiter Array zuende
            temparray[i] = b[pos1++];
        else if (b[pos1] &gt; c[pos2])
            temparray[i] = c[pos2++];
        else
            temparray[i] = b[pos1++];
    }
    //Rückkopieren in Array
    for (int i = 0; i &lt; laenge1; i++)
        b[i] = temparray[i];
    for (int i = laenge1; i &lt; laenge1 + laenge2; i++)
        c[i-laenge1] = temparray[i];
}
</code></pre>
<blockquote>
<p>Die Aufgabenstellung verlangt, dass du die Elemente innerhalb deiner sortMergefunktion kopierst. Und das ist auch nicht ganz ohne Sinn.</p>
</blockquote>
<p>Meinst du, dass die Funktion &quot;merge&quot; direkt in &quot;sortMerge&quot; integriert sein soll?</p>
<blockquote>
<p>Müsst ihr das mit new/delete machen? Könnt ihr nicht einfach vector nehmen? Falls new/delete: Benutz hinterher auf jeden Fall einen Speicherdebugger, ob auch alles sauber freigegeben wurde.</p>
</blockquote>
<p>Ja, wir sollen das mit new/delete machen.<br />
Was sind Speicherdebugger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001940</guid><dc:creator><![CDATA[Thunderstick]]></dc:creator><pubDate>Mon, 03 Jan 2011 18:52:57 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mittels Rekursion: sortMerge(n,a) on Mon, 03 Jan 2011 18:58:23 GMT]]></title><description><![CDATA[<p>Thunderstick schrieb:</p>
<blockquote>
<p>Habe das nun überarbeitet:</p>
<pre><code class="language-cpp">void sortMerge(int n, int *a){
	void merge(int *a1, int laenge1, int *a2, int laenge2);
    if (n&gt;1) { // Wenn Array mehr als 1 Element enthält
        sortMerge(n/2, a);
        sortMerge((n+1)/2, a + n/2);
        merge(a, n/2, a + n/2, (n+1)/2);
	}
}   

void merge(int *b, int laenge1, int *c, int laenge2){
    int pos1 = 0, pos2 = 0; //Positionen im Array
	int *temparray = new int[laenge1+laenge2];
    for (int i = 0; i &lt; laenge1 + laenge2; i++){
        if (pos1 == laenge1) //erster Array zuende
            temparray[i] = c[pos2++];
        else if (pos2 == laenge2) //zweiter Array zuende
            temparray[i] = b[pos1++];
        else if (b[pos1] &gt; c[pos2])
            temparray[i] = c[pos2++];
        else
            temparray[i] = b[pos1++];
    }
    //Rückkopieren in Array
    for (int i = 0; i &lt; laenge1; i++)
        b[i] = temparray[i];
    for (int i = laenge1; i &lt; laenge1 + laenge2; i++)
        c[i-laenge1] = temparray[i];
}
</code></pre>
</blockquote>
<p>Ok, das sieht doch recht in Ordnung aus. Gibt es noch Gründe zur Klage? Funktioniert es?</p>
<blockquote>
<blockquote>
<p>Die Aufgabenstellung verlangt, dass du die Elemente innerhalb deiner sortMergefunktion kopierst. Und das ist auch nicht ganz ohne Sinn.</p>
</blockquote>
<p>Meinst du, dass die Funktion &quot;merge&quot; direkt in &quot;sortMerge&quot; integriert sein soll?</p>
</blockquote>
<p>Nein, das ist schon ok so. Es hält sich zwar nicht 100% an die Aufgabenstellung, aber das ist Geschmackssache.</p>
<blockquote>
<blockquote>
<p>Müsst ihr das mit new/delete machen? Könnt ihr nicht einfach vector nehmen? Falls new/delete: Benutz hinterher auf jeden Fall einen Speicherdebugger, ob auch alles sauber freigegeben wurde.</p>
</blockquote>
<p>Ja, wir sollen das mit new/delete machen.<br />
Was sind Speicherdebugger?</p>
</blockquote>
<p>Ein Programm welches dir sagt, ob du bei new/delete-Orgien etwas falsch gemacht hast. So wie du es hast, denn dein temparray wird nirgends mehr freigegeben. Ein Beispiel dafür wäre valgrind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001944</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 03 Jan 2011 18:58:23 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion mittels Rekursion: sortMerge(n,a) on Mon, 03 Jan 2011 19:57:54 GMT]]></title><description><![CDATA[<p>Habe das Ganze jetzt etwas anders gestaltet.<br />
Ich denke, dass das nun eher an der Aufgabenstellung liegt?</p>
<pre><code class="language-cpp">void sortMerge(int n, int *a){
	void merge(int *a,int p,int *b,int q, int *c,int n);
    if (n&gt;1) { // wenn Array mehr als 1 Element enthält

		int *b = new int[n/2];
		int *c = new int[(n + 1)/2];
		int i;
		for(i=0; i &lt; n/2; i++) { // Erste Hälfte in b kopieren
			b[i] = a[i];
		}
		for(i=n/2; i &lt; n; i++) { // Zweite Hälfte in c kopieren
			c[i - n/2] = a[i];
		}

		// Arrays einzeln rekursiv sortieren
		sortMerge(n/2, b);
		sortMerge(n-n/2, c);

		// Arrays b und c zusammenfügen
		merge(b,n/2,c,n-n/2,a,n);

		// Arrays b und c wieder löschen
		delete b;
		delete c;
	}
}   

void merge(int *b,int p,int *c,int q, int *a,int n)
{
	int i=0,j=0,k=0;
	while(i&lt;p &amp;&amp; j&lt;q) // solange Arrays b und c noch Elemente enthalten
	{
		if(b[i]&lt;=c[j]) { // wenn i-tes Element von b größer-gleich i-tes Element von c
			a[k]=b[i];
			i++;
		} else {
			a[k]=c[j];
			j++;
		}
		k++;
	}
	if(i==p) { // restlichen Elemente von c in a kopieren
		while(j&lt;q) {
			a[k]=c[j];
			j++;
			k++;
		}
	} else { // restlichen Elemente von b in a kopieren
		while(i&lt;p) {
			a[k]=b[i];
			i++;
			k++;
		}
	}
}
</code></pre>
<p>Vielen Dank schon mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001967</guid><dc:creator><![CDATA[Thunderstick]]></dc:creator><pubDate>Mon, 03 Jan 2011 19:57:54 GMT</pubDate></item></channel></rss>