Ergebnis 1 bis 7 von 7
  1. #1
    Psychedelixx ist offline Jungspund
    registriert
    21-02-2009
    Beiträge
    17

    Einfacher BubbleSort funktioniert nicht

    Hi

    ich möchte einen ganz einfachen Bubblesort anwenden. Stark vereinfacht ist das meine Ausgangssituation:

    Code:
    <script type="text/javascript">
    function sort() {	
    	var list = document.getElementsByTagName("div");
    
    	for(var n=list.length; n>1; n--)
    		for(var i=0; i<n-1; i++)
    			if (list[i].innerHTML > list[i+1].innerHTML)
    				swap(list[i+1]);
    }		
    		
    function swap(elem){
        elem.parentNode.insertBefore(elem,elem.previousSibling);
    }
    </script>
    
    <div>1</div>
    <div>5</div>
    <div>4</div>
    <div>3</div>
    <div>8</div>
    <div>7</div>
    <div>4</div>
    
    <input type="button" onclick="sort();" value="Sortiere"/>
    Ich muss allerdings mehrmals auf den Button klicken, um zu sortieren.
    Vielleicht bin ich nur blind vor Müdigkeit. Könnt ihr einen Fehler entdecken?

  2. #2
    Avatar von scrypter
    scrypter ist offline Haudegen
    registriert
    25-06-2011
    Beiträge
    706

    AW: Einfacher BubbleSort funktioniert nicht

    einfach sort() im loop nochmal aufrufen
    Code:
    function sort() {	
    	var list = document.getElementsByTagName("div");
    
    	for(var n=list.length; n>1; n--) {
    		for(var i=0; i<n-1; i++) {
    			if (list[i].innerHTML > list[i+1].innerHTML) {
    				swap(list[i+1]);
    				sort();
    			}
    		}
    	}
    }		
    		
    function swap(elem) {
        elem.parentNode.insertBefore(elem,elem.previousSibling);
    }
    fatal error: EBKAC (error between keybord and chair)

  3. #3
    Psychedelixx ist offline Jungspund
    registriert
    21-02-2009
    Beiträge
    17

    AW: Einfacher BubbleSort funktioniert nicht

    Vielen Dank für deine Antwort!
    Warum muss ich das?

    Aber ist das denn dann noch ein quadratisches Laufzeitverhalten? Und es besteht keine Gefahr einer Endlosschleife bzw. einer endlosen Rekursion?

    (vom Handy, deswegen etwas knapp formuliert)

  4. #4
    Psychedelixx ist offline Jungspund
    registriert
    21-02-2009
    Beiträge
    17

    AW: Einfacher BubbleSort funktioniert nicht

    So, jetzt bin ich wieder am PC

    Ich habs gerade getestet, und in dem vereinfachten Beispiel klappt es auch wunderbar. Aber in der echten Ausgangssituation dauert das Sortieren von ca. 50 Datensätzen in etwa 8 Sekunden.
    Ich möchte beim Klick auf eine Tabellenüberschrift die Tabelle nach der angeklickten Spalte sortieren (ich weiß, dass es dafür genügend Lösungen gibt, aber ich möchte die Algorithmen selbst entwerfen, um nebenbei was fürs Studium zu lernen).

    Macht es Sinn, statt BubbleSort QuickSort zu nutzen, oder reicht es, den aktuellen Algorithmus noch optimieren (wie?)? Das ist mein persönliches Kochbuch, es wird also niemals all zu viele Datensätze geben... (< 1000 erst mal)

    Mein Code sieht so aus:
    Code:
    function sort(order, table, by) {
    	for(var n=table.getElementsByTagName("tr").length; n>1; n--) {
    		for(var i=1; i<n-1; i++) {
    			var thisRecipeTitel = table.getElementsByTagName("tr")[i].childNodes[3].childNodes[1];
    			var thisRecipeTyp = table.getElementsByTagName("tr")[i].childNodes[5];
    			var thisRecipeDauer = table.getElementsByTagName("tr")[i].childNodes[9];
    			
    			var nextRecipeTitel = table.getElementsByTagName("tr")[i+1].childNodes[3].childNodes[1];
    			var nextRecipeTyp = table.getElementsByTagName("tr")[i+1].childNodes[5];
    			var nextRecipeDauer = table.getElementsByTagName("tr")[i+1].childNodes[9];
    			/*
    			if (by == "titel") {
    				if(getSmallText(thisRecipeTitel).localeCompare(getSmallText(nextRecipeTitel)) > 0) {
    					alert("test");
    				}
    			} else if (by == "typ") {
    				if(getSmallText(thisRecipeTyp).localeCompare(getSmallText(nextRecipeTyp)) > 0) {
    					swap(nextRecipeTyp.parentNode);
    				}
    			} else */if (by == "dauer") {
    				if(parseInt(thisRecipeDauer.innerHTML) > parseInt(nextRecipeDauer.innerHTML)) {
    					swap(nextRecipeDauer.parentNode);
    					sort("asc", table, "dauer");
    				}
    			} 
    		}
    	}
    }
    
    function getSmallText(elem) {
        return elem.innerHTML.toLowerCase().trim();
    }
    
    function swap(elem){
        elem.parentNode.insertBefore(elem,elem.previousSibling);
    }
    HTML Ausschnitt:
    HTML-Code:
    <table id="tabRezepte" class="rezepte" cellpadding="2" cellspacing="0">
    	<tbody>
    		<tr id="tabRezepteHeader">
    			<th id="thTitel" style="width:294px; cursor: pointer;" onclick="sort('asc', this.parentNode.parentNode.parentNode, 'titel');">
    				Titel
    			</th>
    			<th id="thTypID" style="display:none">
    				TypID
    			</th>
    			<th id="thTyp" style="width:130px; cursor: pointer;" onclick="sort('asc', this.parentNode.parentNode.parentNode, 'typ');">
    				Typ
    			</th>
    			<th id="thDauer" style="width:130px; cursor: pointer;" onclick="sort('asc', this.parentNode.parentNode.parentNode, 'dauer');">
    				Dauer (Minuten)
    			</th>
    			<th id="thAktion" style="width:140px">
    				Aktion
    			</th>
    		</tr>
    		<tr>
    			<td style="width:294px">
    				<a href="detailRezept.php?rID=47">Blattspinat</a>
    			</td>
    			<td style="display:none">
    				5						
    			</td>
    			<td style="width:130px">
    				Beilage						
    			</td>
    			<td style="width:130px">
    				40						
    			</td>
    			<td style="width:140px">
    				<a href="detailRezept.php?rID=47" class="imgLink">
    					<img class="button" src="img/lupe.png">
    				</a>
    				<a href="printRezept.php?rID=47" class="imgLink">
    					<img class="button" src="img/drucken.png">
    				</a>				
    			</td>
    		</tr>
    		<tr>
    			<td style="width:294px">
    				<a href="detailRezept.php?rID=67">Bolognese</a>
    			</td>
    			<td style="display:none">
    				2						
    			</td>
    			<td style="width:130px">
    				Sauce / Dip						
    			</td>
    			<td style="width:130px">
    				200						
    			</td>
    			<td style="width:140px">
    				<a href="detailRezept.php?rID=67" class="imgLink">
    					<img class="button" src="img/lupe.png">
    				</a>
    				<a href="printRezept.php?rID=67" class="imgLink">
    					<img class="button" src="img/drucken.png">
    				</a>
    			</td>
    		</tr>
    	</tbody>
    </table>	

  5. #5
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Einfacher BubbleSort funktioniert nicht

    Du darfst nicht "live" sortieren und umhängen, dadurch vergleichst du Elemente die nicht den Index haben, den du in der Schleife benutzt.

    Ein andere Möglichkeit mit einem durchgang wäre so was
    PHP-Code:
    function sort() {    
        var list = Array.
    slice(document.getElementsByTagName("div"));
        list = list.
    sort(function(ab) {
            return 
    a.innerHTML b.innerHTML;
        });
        
        for(var 
    0< list.lengthi++){
            list[
    0].parentNode.appendChild(list[i]);
        }


  6. #6
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Einfacher BubbleSort funktioniert nicht

    Zitat Zitat von Psychedelixx Beitrag anzeigen
    So, jetzt bin ich wieder am PC

    Ich habs gerade getestet, und in dem vereinfachten Beispiel klappt es auch wunderbar. Aber in der echten Ausgangssituation dauert das Sortieren von ca. 50 Datensätzen in etwa 8 Sekunden.
    Ich möchte beim Klick auf eine Tabellenüberschrift die Tabelle nach der angeklickten Spalte sortieren (ich weiß, dass es dafür genügend Lösungen gibt, aber ich möchte die Algorithmen selbst entwerfen, um nebenbei was fürs Studium zu lernen).
    Tabellen sortieren ist wiederrum eine Sache für sich. Ich hatte mich damit auch mal eine Weile beschäftigt und die schnellste Lösung die ich umgesetzt habe ist diese Tabellen sortieren [Javascript ist Toll!]

  7. #7
    Psychedelixx ist offline Jungspund
    registriert
    21-02-2009
    Beiträge
    17

    AW: Einfacher BubbleSort funktioniert nicht

    Vielen Dank, das scheint ja genau das zu tun, was ich brauche
    Schade nur, dass der Lernerfolg nicht so groß ist, wenn ich es nicht selbst entwickle.

Ähnliche Themen

  1. Bubblesort-ähnliche Funktion
    Von merte im Forum JavaScript
    Antworten: 2
    Letzter Beitrag: 04-06-2012, 22:01
  2. Antworten: 10
    Letzter Beitrag: 14-03-2012, 09:42
  3. jQuery: Einfacher slideToggle Effekt geht nicht
    Von karlk im Forum JavaScript
    Antworten: 1
    Letzter Beitrag: 20-02-2010, 18:26
  4. Antworten: 6
    Letzter Beitrag: 22-10-2009, 12:39
  5. einfacher Bildwechsel will nicht
    Von GELight im Forum JavaScript
    Antworten: 9
    Letzter Beitrag: 28-03-2005, 18:33

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •