Ergebnis 1 bis 11 von 11
  1. #1
    Lightning ist offline Grünschnabel
    registriert
    11-12-2011
    Beiträge
    4

    Funktion aufrufen [Anfänger frage]

    Hi Community,
    da ich zum ersten mal JavaScript programmiere... habe ich wahrscheinlich eine leichte Frage - es geht drum eine Funktion zu starten.

    Ich versuche gerade den quicksort Algorithmus von rosettaCode zu verstehen[ für JavaScript]:
    Code:
    <html>
     <head>
     <script type="text/javascript">
     function sort(array, less) {
     
      function swap(i, j) { var t=array[i]; array[i]=array[j]; array[j]=t }
      
      function quicksort(left, right) {
     
        if (left < right) {
     
          var pivot = array[(left + right) >> 1];
    	  //document.write("Pivot Element: );
    	  //document.write(pivot);
    	  //document.write("</br>");
    	  alert(pivot);
          var left_new = left, right_new = right;
     
          do {
            while (less(array[left_new], pivot)
              left_new++;
            while (less(pivot, array[right_new])
              right_new--;
            if (left_new  <= right_new)
              swap(left_new++, right_new--);
          } while (left_new  <= right_new);
     
          quicksort(left, right_new);
          quicksort(left_new, right);
     
        }
      }
     
      quicksort(0, array.length-1);
     
      return array;
    }
    function startIt(){
    	var unsortiertMitNull=[503, 087, 512, 061, 908, 170, 897, 275, 653, 426, 154, 509, 612, 677, 765, 703];
    	var unsortiertOhneNull=[503, 87, 512, 61, 908, 170, 897, 275, 653, 426, 154, 509, 612, 677, 765, 703];
    	var sortiertMitNull=[061,087,154,170,275,426,503,509,512,612,653,677,703,765,897,908];
    	var sortiertOhneNull=[61,87,154,170,275,426,503,509,512,612,653,677,703,765,897,908];
    	sort(unsortiertMitNull);
    	
    }
     </script>
     </head>
    
     <body>
    	<h1>Unsortiert mit Null</h1>
    	<a href="javascript:startIt()">StartIt</a></br>
     </body>
     </html>
    Auf der Webseite erscheint zwar StartIt doch wenn ich es klicke erscheint nichts auf dem Browser Fenster:
    Ich möchte dass ein Array dass ich angegeben habe nach dem quicksort verfahren sortiert wird - was muss ich ändern damit es funktioniert ?

    Zweite Frage, was ist dass "less" in der Parameter Liste von sort ... und was genau macht
    var pivot = array[(left + right) >> 1]; , zu welcher stelle im array spring es

    hoffe ich war nicht zu unklar ... danke im voraus

    ROSSETA CODE LINK: http://rosettacode.org/wiki/Sorting_...ort#JavaScript
    Geändert von Lightning (11-12-2011 um 13:43 Uhr) Grund: Link hinzugefügt

  2. #2
    rico2009 Guest

    AW: Funktion aufrufen [Anfänger frage]

    Hi,

    am besten schaust du erst mal in die Fehlerkonsole. => http://forum.jswelt.de/javascript-fa...erkonsole.html (Wo finde ich die Fehlerkonsole?) . Was sagt sie? Ansonsten kann man so was eigentlich immer per onclick (http://de.selfhtml.org/javascript/sp...enthandler.htm) aufrufen.

    Zweite Frage, was ist dass "less" in der Parameter Liste von sort
    Das ist einfach eine weitere Variable, die irgendwelche Werte enthalten kann.

    und was genau macht var pivot = array[(left + right) >> 1]; ...
    Das kann ich dir auch nicht genau sagen, dafür fehlt mir der Inhalt der beiden Variablen left und right. Das >> 1 habe ich auch noch nie gesehen. Ist das vielleicht irgendein Zähler oder ein Vergleichsoperator für arrays?

    Gruß
    Geändert von rico2009 (11-12-2011 um 14:12 Uhr)

  3. #3
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.760

    AW: Funktion aufrufen [Anfänger frage]

    >> ist ein Bitoperator (right shift) und sollte in JS nicht verwendet werdene, da JS keinen Int-Type hat.

  4. #4
    Lightning ist offline Grünschnabel
    registriert
    11-12-2011
    Beiträge
    4

    AW: Funktion aufrufen [Anfänger frage]

    Sollte nicht benutzt werden , doch wird offiziell von rosetta code benutzt :S

    Kann mir jemand helfen ein lauffähiges Beispiel zu erstellen ... so dass ich ihm ein array gebe und er es per quicksort sortiert ?

    CODE: http://rosettacode.org/wiki/Sorting_...ort#JavaScript

    Was mache ich Falsch im letzten Post ??

  5. #5
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.760

    AW: Funktion aufrufen [Anfänger frage]

    Der JS -Code ist nicht gut. Lass' ihn mal durch JSLint oder JSHint durchlaufen...

    Der Code braucht den Parameter less - das ist die Vergleichsfunktion zwischen den einzelnen Elementen.

  6. #6
    Lightning ist offline Grünschnabel
    registriert
    11-12-2011
    Beiträge
    4

    AW: Funktion aufrufen [Anfänger frage]

    Hi kkapsner,
    habe es jetzt zum laufen gebracht und zwar mit der zweiten version von der rosseta code seite, doch jetzt frage ich mich wie viele vegleiche gemacht werden ... ich schreibe mal meinen Code hier rein:

    Code:
    <html>
     <head>
     <script type="text/javascript">
     function quicksort(){
     
    	var counter=0;
     
    	Array.prototype.filter = function(fun /*, thisp*/)
      {
        var len = this.length;
        if (typeof fun != "function")
          throw new TypeError();
    
        var res = new Array();
        var thisp = arguments[1];
        for (var i = 0; i < len; i++)
        {
          if (i in this)
          {
            var val = this[i]; // in case fun mutates this
            if (fun.call(thisp, val, i, this)){
              res.push(val);
    		  counter++;
    		  }
          }
        }
    
        return res;
      };
    	var unsortiertMitNull=new Array(503, 087, 512, 061, 908, 170, 897, 275, 653, 426, 154, 509, 612, 677, 765, 703);
    	var unsortiertOhneNull=new Array(503, 87, 512, 61, 908, 170, 897, 275, 653, 426, 154, 509, 612, 677, 765, 703);
    	var sortiertMitNull=new Array(061,087,154,170,275,426,503,509,512,612,653,677,703,765,897,908);
    	var sortiertOhneNull=new Array(61,87,154,170,275,426,503,509,512,612,653,677,703,765,897,908);
    	var multimenge= new Array(0,0,1,0,1,0,0,1,1,0,1,0,0,0,1,1,0,1,1,1);
    	var counter=0;
     Array.prototype.quick_sort = function ()
    {
    	//counter++;
        if (this.length <= 1)
            return this;
     
        var pivot = this[Math.round(this.length / 2)];
     
        return this.filter(function (x) { return x <  pivot }).quick_sort().concat(
               this.filter(function (x) { return x == pivot })).concat(
               this.filter(function (x) { return x >  pivot }).quick_sort());
    }
    //alert(unsortiertMitNull.quick_sort());
    document.write(unsortiertMitNull.quick_sort());
    document.write("</br>"+counter);
    //alert(counter);
    }
     </script>
     </head>
    
     <body>
    	<form>
    	<input type="button" value="Quicksort"
     onclick="quicksort();">
    </form>
     </body>
     </html>
    Könntest du prüfen ob die counter variablen richtig gesetzt sind ?
    Ich möchte das jedes mal wenn er zwei Zahlen vergleicht er denn counter um eins erhöht.

  7. #7
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.760

    AW: Funktion aufrufen [Anfänger frage]

    Der Vergleich wird in der Callback-Funktion zu .filter ausgeführt - da solltest du auch hochzählen.

    Aber dieser Code ist nicht viel besser: viele unnötige Arrayerzeugungen und inkonsistente Rückgabewerte (wenn das Array nur ein Element lang ist, wird das Array selbst zurückgegeben und wenn nicht, wird ein neu erstelltest Array zurückgegeben).

  8. #8
    Avatar von jspit
    jspit ist offline Lounge-Member
    registriert
    19-06-2009
    Beiträge
    1.712

    AW: Funktion aufrufen [Anfänger frage]

    Zitat Zitat von kkapsner Beitrag anzeigen
    >> ist ein Bitoperator (right shift) und sollte in JS nicht verwendet werdene, da JS keinen Int-Type hat.
    Die Bitoperatoren arbeiten in JS auf intern auf 32Bit Basis. Die obige Aussage ist mir zu pauschal. Im 32Bit-Bereich werden Bitoperatoren sehr oft eingesetzt, insbesondere wenn es auf Geschwindigkeit ankommt. Man muß halt genau wissen, was intern passiert. Der Ausdruck:
    Code:
    (left + right) >> 1
    macht für nicht negative Werte im besagten Bereich das Gleiche wie
    Code:
    parseInt((left+right)/2)
    , nur schneller. Bildlich wird im obigen Code das Element in der Mitte des Bereiches gegriffen.

  9. #9
    Lightning ist offline Grünschnabel
    registriert
    11-12-2011
    Beiträge
    4

    AW: Funktion aufrufen [Anfänger frage]

    @jspit vielen dank für die erklärung habe mir schon gedacht dass er das mittlere element nimmt da es am besten ist wenn das mittlere das pivot element ist -> danke

    @kkapsner genau wie du schon gesagt hast, ist der algorithmus nicht besonders effektiv da immer neue arrays erzeugt werden, und die dann bearbeitet werden -> das gleiche hat mir mein prof gesagt ... da ich gemeint habe dass dieser algorithmus stabil ist, was eigentlich nicht der fall ist bei quicksort. Weil er aber neue arrays erzeugt ist dies der fall.

    jetzt bleibt mir nichts anderes übrig als diesen quicksort code zu starten:
    Code:
    function sort(array, less) {
     
      function swap(i, j) { var t=array[i]; array[i]=array[j]; array[j]=t }
     
      function quicksort(left, right) {
     
        if (left < right) {
     
          var pivot = array[(left + right) >> 1];
          var left_new = left, right_new = right;
     
          do {
            while (less(array[left_new], pivot)
              left_new++;
            while (less(pivot, array[right_new])
              right_new--;
            if (left_new  <= right_new)
              swap(left_new++, right_new--);
          } while (left_new  <= right_new);
     
          quicksort(left, right_new);
          quicksort(left_new, right);
     
        }
      }
     
      quicksort(0, array.length-1);
     
      return array;
    }
    doch wie kann ich diese funktion sort aufrufen ???
    ich weiss nicht was als zweiter parameter übergeben werden soll -
    z.B: var arrayTest=new Array(1,9,6,4,9,6,8);
    sort(arrayTest, ? )

    habt ihr eine Idee

  10. #10
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.760

    AW: Funktion aufrufen [Anfänger frage]

    Als zweiten Parameter muss du eine Funktionsreferenz übergeben, die zwei Parameter annimmt (die beiden zu vergleichenden Elemente) und dann zurückgibt, ob das erste Element kleiner als das zweite ist.

  11. #11
    Avatar von jspit
    jspit ist offline Lounge-Member
    registriert
    19-06-2009
    Beiträge
    1.712

    AW: Funktion aufrufen [Anfänger frage]

    Die obige quicksort function ist leider nicht fehlerfrei (2 Flüchtigkeitsfehler, auch im Orginal), dazu der hier meist genutzte Link - Wo finde ich die Fehlerkonsole?

    Edit
    Nebenbei noch: Eine function swap die genau 1x benutzt wird macht für mich auch nicht viel Sinn...
    Geändert von jspit (13-12-2011 um 09:03 Uhr)

Ähnliche Themen

  1. Funktion in einer Callback-Funktion aufrufen
    Von ShoAn im Forum JavaScript
    Antworten: 3
    Letzter Beitrag: 18-03-2009, 14:19
  2. Antworten: 9
    Letzter Beitrag: 03-03-2009, 17:39
  3. SQL-Anfänger-Frage
    Von Denny5 im Forum Serverseitige Programmierung
    Antworten: 4
    Letzter Beitrag: 24-10-2008, 10:42
  4. Anfänger Frage
    Von DonHoschy im Forum Allgemeines
    Antworten: 6
    Letzter Beitrag: 04-05-2002, 19:45
  5. my sql Anfänger Frage
    Von TheSilencer im Forum JavaScript
    Antworten: 1
    Letzter Beitrag: 13-08-2000, 22:46

Stichworte

Lesezeichen

Berechtigungen

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