<?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[Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666);]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich muss für die Uni einen Heap mit Heapsort (Max-Heap) programmieren. Mein konkretes Problem, wie man oben sieht liegt in der apply Methode. Der Fehler wird, dass habe ich schon heraus gefunden, ausgeworfen, weil bei jedem zweiten Aufruf von apply ascending der zweite und der dritte Wert immer vertauscht sind. Absteigend sortieren funktioniert einwandfrei. Ich weiß natürlich, dass es irgendwo in der Sortierung liegen muss, aber wie sich der Fehler einschleicht kann ich mir nicht erklären, weil sie ja bei jedem ersten Versuch richtig funktioniert.</p>
<pre><code class="language-cpp">template &lt;typename E&gt;
size_t HEAP&lt;E&gt;::apply(const Functor&lt;E&gt;&amp; f, Order order) const {
    if(order != dontcare) {
        size_t heapsize = n;
        BuildMaxHeap(heapsize);
        for(size_t i = size()-1; i &gt;= 1; i--) {
            swap(a[0], a[i]);
            heapsize--;
            heapify(0, heapsize);
        }
        else if(order == ascending) {
            for (int i = 0; i &lt; (HEAP&lt;E&gt;::n+1); ++i) {
                ++rc;
                if(!f(a[i]))break;
            }	
        }
    }

    int heapgroesse = n;

    if(a[n]&gt;a[0]) {
        swap(a[0],a[n]);

        for(size_t i=1; i&lt;size(); i++) {	
            heapify(i, heapgroesse);
        }
    }			

    return rc;	
}
</code></pre>
<p>Alles andere funktioniert und meine Literatur ist mittlerweile auch schon erschöpft. Kann mir vielleicht irgendwer weiterhelfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292684/max-heap-functor-aufruf-1-mit-falschem-key-4711-statt-666</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 16:32:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292684.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Sep 2011 13:23:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666); on Thu, 15 Sep 2011 17:09:34 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich muss für die Uni einen Heap mit Heapsort (Max-Heap) programmieren. Mein konkretes Problem, wie man oben sieht liegt in der apply Methode. Der Fehler wird, dass habe ich schon heraus gefunden, ausgeworfen, weil bei jedem zweiten Aufruf von apply ascending der zweite und der dritte Wert immer vertauscht sind. Absteigend sortieren funktioniert einwandfrei. Ich weiß natürlich, dass es irgendwo in der Sortierung liegen muss, aber wie sich der Fehler einschleicht kann ich mir nicht erklären, weil sie ja bei jedem ersten Versuch richtig funktioniert.</p>
<pre><code class="language-cpp">template &lt;typename E&gt;
size_t HEAP&lt;E&gt;::apply(const Functor&lt;E&gt;&amp; f, Order order) const {
    if(order != dontcare) {
        size_t heapsize = n;
        BuildMaxHeap(heapsize);
        for(size_t i = size()-1; i &gt;= 1; i--) {
            swap(a[0], a[i]);
            heapsize--;
            heapify(0, heapsize);
        }
        else if(order == ascending) {
            for (int i = 0; i &lt; (HEAP&lt;E&gt;::n+1); ++i) {
                ++rc;
                if(!f(a[i]))break;
            }	
        }
    }

    int heapgroesse = n;

    if(a[n]&gt;a[0]) {
        swap(a[0],a[n]);

        for(size_t i=1; i&lt;size(); i++) {	
            heapify(i, heapgroesse);
        }
    }			

    return rc;	
}
</code></pre>
<p>Alles andere funktioniert und meine Literatur ist mittlerweile auch schon erschöpft. Kann mir vielleicht irgendwer weiterhelfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119727</guid><dc:creator><![CDATA[tinkabell]]></dc:creator><pubDate>Thu, 15 Sep 2011 17:09:34 GMT</pubDate></item><item><title><![CDATA[Reply to Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666); on Thu, 15 Sep 2011 15:50:31 GMT]]></title><description><![CDATA[<p>Was für Werte kann denn order haben? Abgesehen davon, daß der Code etwas unregelmäßig formatiert ist, scheinen dort ein paar Klammern zu fehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119812</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 15 Sep 2011 15:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666); on Thu, 15 Sep 2011 17:03:49 GMT]]></title><description><![CDATA[<p>Klammern fehlen keine. Die Formatierung ist schon etwas unregelmäßig, dafür möchte ich mich herzlichst entschuldigen. Aber ich hatte etwas Streß, währrend ich den Thread erstellt habe.</p>
<p>Nun zum eigentlichen, order kann den Wert ascending, descending oder dontcare einnehmen. Dontcare und descending funktionieren. Wie oben beschrieben wird beim ersten Durchlauf der Methode, wenn ascending gewählt word korrekt sortiert und beim zweiten Mal hackt es, aber da auch &quot;nur&quot; bei den ersten beiden Einträgen nach der Wurzel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119828</guid><dc:creator><![CDATA[tinkabell]]></dc:creator><pubDate>Thu, 15 Sep 2011 17:03:49 GMT</pubDate></item><item><title><![CDATA[Reply to Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666); on Thu, 15 Sep 2011 17:14:10 GMT]]></title><description><![CDATA[<p>Ich war mal so frei, die Formatierung ein wenig geradezubiegen. Und jetzt sieht man auch deutlich, daß zu dem else in Zeile 11 das if() fehlt.<br />
Ansonsten: Das erste if() gilt sowohl für ascending als auch für descending und wie du den Unterschied der Sortierrichtung einarbeitest kann ich nicht so richtig erkennen (theoretisch müsste schon der heapify()-Aufruf die Richtung berücksichtigen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119834</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 15 Sep 2011 17:14:10 GMT</pubDate></item><item><title><![CDATA[Reply to Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666); on Thu, 15 Sep 2011 18:50:03 GMT]]></title><description><![CDATA[<p>Ich wollte den Code eigentlich kürzen, um ihn übersichtlicher zu machen, weil es ja vorher zu viel war.</p>
<pre><code class="language-cpp">[code]template &lt;typename E&gt;
size_t HEAP&lt;E&gt;::apply(const Functor&lt;E&gt;&amp; f, Order order) const {
	if(HEAP&lt;E&gt;::n == -1) {
		return 0;
  	}

	size_t rc = 0;

	if(order != dontcare) {
             size_t heapsize = n;
             BuildMaxHeap(heapsize);
             for(size_t i = size()-1; i &gt;= 1; i--) {
                     swap(a[0], a[i]);
                     heapsize--;
                     heapify(0, heapsize);
             }
//////////////////////////////////////////////////////////////////////////

			if(order == descending) {
				for (int i = (HEAP&lt;E&gt;::n+1); i-- &gt; 0; ) {
					++rc;		
                	if(!f(a[i]))break;
				}
			}

			else if(order == ascending) {
				for (int i = 0; i &lt; (HEAP&lt;E&gt;::n+1); ++i) {
						++rc;
                		if(!f(a[i]))break;
				}	

		   }
	}

	else if(order == dontcare) {
        for(int i=0; i &lt; (HEAP&lt;E&gt;::n+1); i++) {
			    ++rc;
            	if(!f(HEAP&lt;E&gt;::a[i]))break;
		}
	}

	int heapgroesse = n;

	if(a[n]&gt;a[0]) {
		swap(a[0],a[n]);

		for(size_t i=1; i&lt;size(); i++) {	
			heapify(i, heapgroesse);
		}
	}			

	return rc;	
}

template &lt;typename E&gt;
void HEAP&lt;E&gt;::heapify(size_t i, size_t heapsize) const{
     size_t left = 2*i + 1;
     size_t right = 2*i + 2;
     size_t largest;

     if (left &lt; heapsize &amp;&amp; a[left] &gt; a[i]) {
        largest = left;
     }

     else 
         largest = i;

     if (right &lt; heapsize &amp;&amp; a[right] &gt; a[largest]) {
        largest = right;
     }

     if (largest != i) {
        swap(a[i], a[largest]);
        heapify(largest, heapsize);
     }
}[/code]
</code></pre>
<p>Ich hoffe, dass es diesmal nicht wieder zu viel Code ist, aber für das Verständnis des Ablaufes benötigt man meiner Meinung nach beide Methoden. heapify() stellt die Heapbedingung für einen Max-Heap wieder her. <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/2119880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119880</guid><dc:creator><![CDATA[tinkabell]]></dc:creator><pubDate>Thu, 15 Sep 2011 18:50:03 GMT</pubDate></item><item><title><![CDATA[Reply to Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666); on Thu, 15 Sep 2011 19:27:46 GMT]]></title><description><![CDATA[<p>Es ist sicher nicht zu viel Code, um dein Problem zu erklären, aber auf Anhieb zu viel Code, um ihn als Außenstehender verarbeiten zu können. Hat es einen Grund, warum du dein HeapSort selber implementiert hast? Die STL bietet schon ein ca. halbes Dutzend fertige Funktionen, um eine Datensammlung sortieren zu können.</p>
<p>Was noch auffällt: Beim Sortieren des Arrays arbeitest du mit n Elementen, bei der Ausgabe verwendest du n+1 als Randbedingung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119893</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 15 Sep 2011 19:27:46 GMT</pubDate></item><item><title><![CDATA[Reply to Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666); on Thu, 15 Sep 2011 20:20:14 GMT]]></title><description><![CDATA[<p>An sich hab ich den Heapsort so implementiert, weil ich von den VO Unterlagen nicht zu weit abweichen wollte. Aber über eine einfachere Möglichkeit wäre ich auch nicht unglücklich. <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="😉"
    /> Kannst du mir eine STL empfehlen für die Sortierung? Die Randbedingungen prüfe ich morgen früh sofort noch einmal prüfen, aber der heap an sich haben zuvor schon vollständig funktioniert, denn ich habe das File schon mal abgegeben und mein Prof hat mir zusätzlich eine inplace Sortierung aufgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119910</guid><dc:creator><![CDATA[tinkabell]]></dc:creator><pubDate>Thu, 15 Sep 2011 20:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666); on Thu, 15 Sep 2011 20:28:16 GMT]]></title><description><![CDATA[<p>tinkabell schrieb:</p>
<blockquote>
<p>Kannst du mir eine STL empfehlen für die Sortierung?</p>
</blockquote>
<p>&quot;eine&quot; STL wird schwierig <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="😃"
    /> STL steht für &quot;Standard Template Library&quot; und ist ein Teil der C++ Standardbibliothek. Wenn es dir nicht um die pädagogische Herausforderung geht, verwende einfach std::sort() (das verwendet zwar idR QuickSort, aber für den erwarteten Effekt ist das egal), ansonsten kannst du dir auch std::make_heap() und std::sort_heap() ansehen.<br />
(alle drei Funktionen findest du in der &lt;algorithm&gt;)</p>
<p>PS: Afair ist ein Heap zwar gut geeignet, um schnell das größte Element einer Sammlung zu finden, aber das ständig Auf- und Abbauen des Heaps geht auch auf die Rechenzeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119912</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 15 Sep 2011 20:28:16 GMT</pubDate></item><item><title><![CDATA[Reply to Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666); on Thu, 15 Sep 2011 21:36:36 GMT]]></title><description><![CDATA[<p>Aber wieso hilft das. Da steht doch, er muss für die Uni nen Heapsort schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119936</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 15 Sep 2011 21:36:36 GMT</pubDate></item><item><title><![CDATA[Reply to Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666); on Thu, 15 Sep 2011 22:06:29 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>das verwendet zwar idR QuickSort, aber für den erwarteten Effekt ist das egal</p>
</blockquote>
<p>Ich weiß nicht, wie das beim GCC ist, aber bei MSVC ists ein Introsort. (Je nach Anzahl entweder Insertion Sort, Quicksort oder Heapsort)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119940</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 15 Sep 2011 22:06:29 GMT</pubDate></item><item><title><![CDATA[Reply to Max-Heap Functor-Aufruf #1 mit falschem key 4711 (statt 666); on Mon, 19 Sep 2011 17:00:46 GMT]]></title><description><![CDATA[<p>Also sort() oder sort_heap(), darf ich nicht verwenden. Das hat mir die Uni untersagt. Ich muss jeden Vorgang selbst ausprogrammieren. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f622.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--crying_face"
      title=";-("
      alt="😢"
    /></p>
<p>Die Randbedingungen sind in Ordnung. Hab das ganze noch einmal überprüft.</p>
<p>Zur Veranschaulichung eine Aussage (ascending):<br />
&gt; apply asc<br />
1 3 5 7 9<br />
returns 5<br />
&gt; apply asc<br />
1 5 3 7 9<br />
returns 5</p>
<p>und im absteigenden Verfahren (descending):<br />
&gt; apply desc<br />
9 7 5 3 1<br />
returns 5<br />
&gt; apply desc<br />
9 7 3 5 1</p>
<p>Irgendwo im Sortierungsablauf muss sich ein Fehler eingeschlichen haben. Aber ich kann nicht genau lokalisieren wo.</p>
<p>Please, please help me!! <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/2121361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2121361</guid><dc:creator><![CDATA[tinkabell]]></dc:creator><pubDate>Mon, 19 Sep 2011 17:00:46 GMT</pubDate></item></channel></rss>