# SelectionSort in Javascript ???



## Jo.Mo. (22. Mai 2011)

Hallo,

ich habe ein Problem mit selectionSort in JavaScript, das beschäftigt mich schon eine weile, wurde aufgrund eines anderen Thread darauf gebracht, mich damit auseinanderzusetzen.

Der einfachheit halber mal der Fall als bubbleSort:


```
var tausch1, tausch2;                                       //Array nach Worthäufigkeit sortieren
            var unsortiert=true;
            while(unsortiert){
            unsortiert=false;
                for(p=0; p < wortHäufigkeit.length-1; p++){
                   if (wortHäufigkeit[p][1] < wortHäufigkeit[p+1][1]){
                     tausch1=wortHäufigkeit[p+1][1];
                     tausch2=wortHäufigkeit[p+1][0];
                     wortHäufigkeit[p+1][1]=wortHäufigkeit[p][1];
                     wortHäufigkeit[p+1][0]=wortHäufigkeit[p][0];
                     wortHäufigkeit[p][1]=tausch1;
                     wortHäufigkeit[p][0]=tausch2;
                     unsortiert=true;
                    }
                }
            }
```

Wie sähe das jetzt als selectionSort aus? Normalerweise sind dort ja nur 2 ineinander verschachtelte Schleifen, die jeweils prüfen ob ein Wert kleiner als der aktuelle existiert, und falls ja, diesen dan tauschen, korrekt?


```
for (i = 0; i < wortHäufigkeit.length; i++) {
      min = i;
      for (j = i+1; j < wortHäufigkeit.length; j++) {
         if (wortHäufigkeit[j] < wortHäufigkeit[min]) {
            min = j;
         }
      }
      tmp = wortHäufigkeit[min];
      wortHäufigkeit[min] = wortHäufigkeit[i];
      wortHäufigkeit[i] = tmp;
   }
```


----------



## Jo.Mo. (22. Mai 2011)

...irgendwas stimmt noch nicht...beim aufrufen des Programms (dass ich der einfachheit halber verwendet habe) stimmen die Ergebnisse nicht mehr - scheinbar weist er nicht die korrekten werte zu (vorher, sprich im oberen Programm, stimmt es ja)...

Was übersehe ich...?

Original:


```
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
     <title>Text-Statistik</title>
	 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
     <script type="text/javascript">
     //<![CDATA[
 
        //Funktion zur Textauswertung
	    function textAuswertung(){
            var text=document.forms['f1'].text.value;
            var wortArray = text.split(" ");                            //Text in Array konvertieren
            for (i=0; i < wortArray.length; i++){                   //Wörter zählen
                 wortArray[i] = normalisierung(wortArray[i]);
            }
            document.forms['f1'].anzahlWorte.value = i;
    
            wortArray.sort();                                           //Array alphabetisch ordnen
    
	        wortHäufigkeit = new Array();                                //Worthäufigkeitstabelle erzeugen
	        var häufigkeit = 1; var k = 0;
            for (j=0; j < wortArray.length; j++){                   //Worthäufigkeit bestimmen
                if (wortArray[j] === wortArray[j+1]){
                   häufigkeit++;
                }
                else {
                    wortHäufigkeit[k]=new Array(2);
                    wortHäufigkeit[k][0]=wortArray[j];
                    wortHäufigkeit[k][1]=häufigkeit;
                    k++;
                    häufigkeit=1;
                }
            }
    
	        var tausch1, tausch2;                                       //Array nach Worthäufigkeit sortieren
            var unsortiert=true;
            while(unsortiert){
            unsortiert=false;
                for(p=0; p < wortHäufigkeit.length-1; p++){
                   if (wortHäufigkeit[p][1] < wortHäufigkeit[p+1][1]){
                     tausch1=wortHäufigkeit[p+1][1];
                     tausch2=wortHäufigkeit[p+1][0];
                     wortHäufigkeit[p+1][1]=wortHäufigkeit[p][1];
                     wortHäufigkeit[p+1][0]=wortHäufigkeit[p][0];
                     wortHäufigkeit[p][1]=tausch1;
                     wortHäufigkeit[p][0]=tausch2;
                     unsortiert=true;
                    }
                }
            }
    
	        //Ausgabe
	        document.forms['f1'].w1.value = wortHäufigkeit[0][0]; document.forms['f1'].w11.value = wortHäufigkeit[0][1]+ " = " + (wortHäufigkeit[0][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w2.value = wortHäufigkeit[1][0]; document.forms['f1'].w12.value = wortHäufigkeit[1][1]+ " = " + (wortHäufigkeit[1][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w3.value = wortHäufigkeit[2][0]; document.forms['f1'].w13.value = wortHäufigkeit[2][1]+ " = " + (wortHäufigkeit[2][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w4.value = wortHäufigkeit[3][0]; document.forms['f1'].w14.value = wortHäufigkeit[3][1]+ " = " + (wortHäufigkeit[3][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w5.value = wortHäufigkeit[4][0]; document.forms['f1'].w15.value = wortHäufigkeit[4][1]+ " = " + (wortHäufigkeit[4][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w6.value = wortHäufigkeit[5][0]; document.forms['f1'].w16.value = wortHäufigkeit[5][1]+ " = " + (wortHäufigkeit[5][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w7.value = wortHäufigkeit[6][0]; document.forms['f1'].w17.value = wortHäufigkeit[6][1]+ " = " + (wortHäufigkeit[6][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w8.value = wortHäufigkeit[7][0]; document.forms['f1'].w18.value = wortHäufigkeit[7][1]+ " = " + (wortHäufigkeit[7][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w9.value = wortHäufigkeit[8][0]; document.forms['f1'].w19.value = wortHäufigkeit[8][1]+ " = " + (wortHäufigkeit[8][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w10.value = wortHäufigkeit[9][0]; document.forms['f1'].w20.value = wortHäufigkeit[9][1]+ " = " + (wortHäufigkeit[9][1]*100/i).toFixed(1) + " %";	
        }
 
        function normalisierung(s) {                                
            var satzZeichen = "\",;:.!?-";                         //Satzzeichen entfernen 
            var w = ""; 
            s = s.toLowerCase();                                   // Umwandlung in Kleinbuchstaben
            for (var i=0; i < s.length; i++) { 
                if (satzZeichen.indexOf( s.charAt(i)) == -1) {     // kein Satzzeichen 
                 w = w + s.charAt(i);                           // in Wortstring übernehmen
                } 
            } 
            return w 
        }
     //]]>
     </script>
  </head>
<body>
<form id="f1" action="textstatistik.html">
    <p>
      <label for="text">Text: </label><br />
         <textarea cols="80" rows="13" name="text"></textarea><br /><br />
      <button type="button" onclick="textAuswertung()">Auswertung</button><br /><br />
      <label for="anzahlWorte">Anzahl der Wörter: </label>
         <input type="text" id="anzahlWorte" name="anzahlWorte" readonly="readonly" /><br /><br />
      <label for="wort">Wort:</label><label for="text">Häufigkeit: </label><br />
      <input type="text" id="w1" name="w1" readonly="readonly" /><input type="text" id="w11" name="w11" readonly="readonly" /><br/>
      <input type="text" id="w2" name="w2" readonly="readonly" /><input type="text" id="w12" name="w12" readonly="readonly" /><br/>
      <input type="text" id="w3" name="w3" readonly="readonly" /><input type="text" id="w13" name="w13" readonly="readonly" /><br/>
      <input type="text" id="w4" name="w4" readonly="readonly" /><input type="text" id="w14" name="w14" readonly="readonly" /><br/>
      <input type="text" id="w5" name="w5" readonly="readonly" /><input type="text" id="w15" name="w15" readonly="readonly" /><br/>
      <input type="text" id="w6" name="w6" readonly="readonly" /><input type="text" id="w16" name="w16" readonly="readonly" /><br/>
      <input type="text" id="w7" name="w7" readonly="readonly" /><input type="text" id="w17" name="w17" readonly="readonly" /><br/>
      <input type="text" id="w8" name="w8" readonly="readonly" /><input type="text" id="w18" name="w18" readonly="readonly" /><br/>
      <input type="text" id="w9" name="w9" readonly="readonly" /><input type="text" id="w19" name="w19" readonly="readonly" /><br/>
      <input type="text" id="w10" name="w10" readonly="readonly" /><input type="text" id="w20" name="w20" readonly="readonly" /><br/>
    </p>
  </form> 
</body>
</html>
```

Programm mit selectionSort:


```
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
     <title>Text-Statistik</title>
	 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
     <script type="text/javascript">
     //<![CDATA[
 
        //Funktion zur Textauswertung
	    function textAuswertung(){
            var text=document.forms['f1'].text.value;
            var wortArray = text.split(" ");                            //Text in Array konvertieren
            for (i=0; i < wortArray.length; i++){                   //Wörter zählen
                 wortArray[i] = normalisierung(wortArray[i]);
            }
            document.forms['f1'].anzahlWorte.value = i;
    
            wortArray.sort();                                           //Array alphabetisch ordnen
    
	        wortHäufigkeit = new Array();                                //Worthäufigkeitstabelle erzeugen
	        var häufigkeit = 1; var k = 0;
            for (j=0; j < wortArray.length; j++){                   //Worthäufigkeit bestimmen
                if (wortArray[j] === wortArray[j+1]){
                   häufigkeit++;
                }
                else {
                    wortHäufigkeit[k]=new Array(2);
                    wortHäufigkeit[k][0]=wortArray[j];
                    wortHäufigkeit[k][1]=häufigkeit;
                    k++;
                    häufigkeit=1;
                }
            }
    
	        for (i = 0; i < wortHäufigkeit.length; i++) {
               min = i;
               for (j = i+1; j < wortHäufigkeit.length; j++) {
                    if (wortHäufigkeit[j] < wortHäufigkeit[min]) {
                     min = j;
                    }
                }
                tmp = wortHäufigkeit[min];
                wortHäufigkeit[min] = wortHäufigkeit[i];
                wortHäufigkeit[i] = tmp;
            }
    
	        //Ausgabe
	        document.forms['f1'].w1.value = wortHäufigkeit[0][0]; document.forms['f1'].w11.value = wortHäufigkeit[0][1]+ " = " + (wortHäufigkeit[0][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w2.value = wortHäufigkeit[1][0]; document.forms['f1'].w12.value = wortHäufigkeit[1][1]+ " = " + (wortHäufigkeit[1][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w3.value = wortHäufigkeit[2][0]; document.forms['f1'].w13.value = wortHäufigkeit[2][1]+ " = " + (wortHäufigkeit[2][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w4.value = wortHäufigkeit[3][0]; document.forms['f1'].w14.value = wortHäufigkeit[3][1]+ " = " + (wortHäufigkeit[3][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w5.value = wortHäufigkeit[4][0]; document.forms['f1'].w15.value = wortHäufigkeit[4][1]+ " = " + (wortHäufigkeit[4][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w6.value = wortHäufigkeit[5][0]; document.forms['f1'].w16.value = wortHäufigkeit[5][1]+ " = " + (wortHäufigkeit[5][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w7.value = wortHäufigkeit[6][0]; document.forms['f1'].w17.value = wortHäufigkeit[6][1]+ " = " + (wortHäufigkeit[6][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w8.value = wortHäufigkeit[7][0]; document.forms['f1'].w18.value = wortHäufigkeit[7][1]+ " = " + (wortHäufigkeit[7][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w9.value = wortHäufigkeit[8][0]; document.forms['f1'].w19.value = wortHäufigkeit[8][1]+ " = " + (wortHäufigkeit[8][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w10.value = wortHäufigkeit[9][0]; document.forms['f1'].w20.value = wortHäufigkeit[9][1]+ " = " + (wortHäufigkeit[9][1]*100/i).toFixed(1) + " %";	
        }
 
        function normalisierung(s) {                                
            var satzZeichen = "\",;:.!?-";                         //Satzzeichen entfernen 
            var w = ""; 
            s = s.toLowerCase();                                   // Umwandlung in Kleinbuchstaben
            for (var i=0; i < s.length; i++) { 
                if (satzZeichen.indexOf( s.charAt(i)) == -1) {     // kein Satzzeichen 
                 w = w + s.charAt(i);                           // in Wortstring übernehmen
                } 
            } 
            return w 
        }
     //]]>
     </script>
  </head>
<body>
<form id="f1" action="textstatistik.html">
    <p>
      <label for="text">Text: </label><br />
         <textarea cols="80" rows="13" name="text"></textarea><br /><br />
      <button type="button" onclick="textAuswertung()">Auswertung</button><br /><br />
      <label for="anzahlWorte">Anzahl der Wörter: </label>
         <input type="text" id="anzahlWorte" name="anzahlWorte" readonly="readonly" /><br /><br />
      <label for="wort">Wort:</label><label for="text">Häufigkeit: </label><br />
      <input type="text" id="w1" name="w1" readonly="readonly" /><input type="text" id="w11" name="w11" readonly="readonly" /><br/>
      <input type="text" id="w2" name="w2" readonly="readonly" /><input type="text" id="w12" name="w12" readonly="readonly" /><br/>
      <input type="text" id="w3" name="w3" readonly="readonly" /><input type="text" id="w13" name="w13" readonly="readonly" /><br/>
      <input type="text" id="w4" name="w4" readonly="readonly" /><input type="text" id="w14" name="w14" readonly="readonly" /><br/>
      <input type="text" id="w5" name="w5" readonly="readonly" /><input type="text" id="w15" name="w15" readonly="readonly" /><br/>
      <input type="text" id="w6" name="w6" readonly="readonly" /><input type="text" id="w16" name="w16" readonly="readonly" /><br/>
      <input type="text" id="w7" name="w7" readonly="readonly" /><input type="text" id="w17" name="w17" readonly="readonly" /><br/>
      <input type="text" id="w8" name="w8" readonly="readonly" /><input type="text" id="w18" name="w18" readonly="readonly" /><br/>
      <input type="text" id="w9" name="w9" readonly="readonly" /><input type="text" id="w19" name="w19" readonly="readonly" /><br/>
      <input type="text" id="w10" name="w10" readonly="readonly" /><input type="text" id="w20" name="w20" readonly="readonly" /><br/>
    </p>
  </form> 
</body>
</html>
```


----------



## JanUlrich (6. Jun 2011)

```
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
     <title>Text-Statistik</title>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
     <script type="text/javascript">
     //<![CDATA[
 
        //Funktion zur Textauswertung
        function textAuswertung(){
            var text=document.forms['f1'].text.value;
            var wortArray = text.split(" ");                            //Text in Array konvertieren
            for (i=0; i < wortArray.length; i++){                   //Wörter zählen
                 wortArray[i] = normalisierung(wortArray[i]);
            }
            document.forms['f1'].anzahlWorte.value = i;
    
            wortArray.sort();                                           //Array alphabetisch ordnen
    
            wortHäufigkeit = new Array();                                //Worthäufigkeitstabelle erzeugen
            var häufigkeit = 1; var k = 0;
            for (j=0; j < wortArray.length; j++){                   //Worthäufigkeit bestimmen
                if (wortArray[j] === wortArray[j+1]){
                   häufigkeit++;
                }
                else {
                    wortHäufigkeit[k]=new Array(2);
                    wortHäufigkeit[k][0]=wortArray[j];
                    wortHäufigkeit[k][1]=häufigkeit;
                    k++;
                    häufigkeit=1;
                }
            }
    		
		//Insertion-Sort START:
            for (l = 0; l < wortHäufigkeit.length; l++) { // hier die Variable l statt i benutzen, da i ab Zeile 54 verwendung findet
               maxi = l; //wir wollen das größte Element oben haben,
               for (j = l; j < wortHäufigkeit.length; j++) { // also suchen wir immer nach dem größten Element zuerst
                    if (wortHäufigkeit[j][1] > wortHäufigkeit[maxi][1]) {
                     maxi = j;
                    }
                }
				tmp0 = wortHäufigkeit[maxi][0]; //das gefundene größte Element wird Zwischengespeichert
				tmp1 = wortHäufigkeit[maxi][1];
				for(k=maxi;k>l;k--){ // die Array Elemente umgeschoben, damit vorne ein freier Platz entsteht
					wortHäufigkeit[k][0]=wortHäufigkeit[k-1][0];
                    wortHäufigkeit[k][1]=wortHäufigkeit[k-1][1];
				}
                
                wortHäufigkeit[l][0] = tmp0; //dann das größte Element an die freie Position einfügen.
                wortHäufigkeit[l][1] = tmp1;
            }
    	//Insertion-Sort ENDE!
		
            //Ausgabe
            document.forms['f1'].w1.value = wortHäufigkeit[0][0]; document.forms['f1'].w11.value = wortHäufigkeit[0][1]+ " = " + (wortHäufigkeit[0][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w2.value = wortHäufigkeit[1][0]; document.forms['f1'].w12.value = wortHäufigkeit[1][1]+ " = " + (wortHäufigkeit[1][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w3.value = wortHäufigkeit[2][0]; document.forms['f1'].w13.value = wortHäufigkeit[2][1]+ " = " + (wortHäufigkeit[2][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w4.value = wortHäufigkeit[3][0]; document.forms['f1'].w14.value = wortHäufigkeit[3][1]+ " = " + (wortHäufigkeit[3][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w5.value = wortHäufigkeit[4][0]; document.forms['f1'].w15.value = wortHäufigkeit[4][1]+ " = " + (wortHäufigkeit[4][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w6.value = wortHäufigkeit[5][0]; document.forms['f1'].w16.value = wortHäufigkeit[5][1]+ " = " + (wortHäufigkeit[5][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w7.value = wortHäufigkeit[6][0]; document.forms['f1'].w17.value = wortHäufigkeit[6][1]+ " = " + (wortHäufigkeit[6][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w8.value = wortHäufigkeit[7][0]; document.forms['f1'].w18.value = wortHäufigkeit[7][1]+ " = " + (wortHäufigkeit[7][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w9.value = wortHäufigkeit[8][0]; document.forms['f1'].w19.value = wortHäufigkeit[8][1]+ " = " + (wortHäufigkeit[8][1]*100/i).toFixed(1) + " %";
            document.forms['f1'].w10.value = wortHäufigkeit[9][0]; document.forms['f1'].w20.value = wortHäufigkeit[9][1]+ " = " + (wortHäufigkeit[9][1]*100/i).toFixed(1) + " %";   
        }
 
        function normalisierung(s) {                                
            var satzZeichen = "\",;:.!?-";                         //Satzzeichen entfernen 
            var w = ""; 
            s = s.toLowerCase();                                   // Umwandlung in Kleinbuchstaben
            for (var i=0; i < s.length; i++) { 
                if (satzZeichen.indexOf( s.charAt(i)) == -1) {     // kein Satzzeichen 
                 w = w + s.charAt(i);                           // in Wortstring übernehmen
                } 
            } 
            return w 
        }
     //]]>
     </script>
  </head>
<body>
<form id="f1" action="textstatistik.html">
    <p>
      <label for="text">Text: </label><br />
         <textarea cols="80" rows="13" name="text"></textarea><br /><br />
      <button type="button" onclick="textAuswertung()">Auswertung</button><br /><br />
      <label for="anzahlWorte">Anzahl der Wörter: </label>
         <input type="text" id="anzahlWorte" name="anzahlWorte" readonly="readonly" /><br /><br />
      <label for="wort">Wort:</label><label for="text">Häufigkeit: </label><br />
      <input type="text" id="w1" name="w1" readonly="readonly" /><input type="text" id="w11" name="w11" readonly="readonly" /><br/>
      <input type="text" id="w2" name="w2" readonly="readonly" /><input type="text" id="w12" name="w12" readonly="readonly" /><br/>
      <input type="text" id="w3" name="w3" readonly="readonly" /><input type="text" id="w13" name="w13" readonly="readonly" /><br/>
      <input type="text" id="w4" name="w4" readonly="readonly" /><input type="text" id="w14" name="w14" readonly="readonly" /><br/>
      <input type="text" id="w5" name="w5" readonly="readonly" /><input type="text" id="w15" name="w15" readonly="readonly" /><br/>
      <input type="text" id="w6" name="w6" readonly="readonly" /><input type="text" id="w16" name="w16" readonly="readonly" /><br/>
      <input type="text" id="w7" name="w7" readonly="readonly" /><input type="text" id="w17" name="w17" readonly="readonly" /><br/>
      <input type="text" id="w8" name="w8" readonly="readonly" /><input type="text" id="w18" name="w18" readonly="readonly" /><br/>
      <input type="text" id="w9" name="w9" readonly="readonly" /><input type="text" id="w19" name="w19" readonly="readonly" /><br/>
      <input type="text" id="w10" name="w10" readonly="readonly" /><input type="text" id="w20" name="w20" readonly="readonly" /><br/>
    </p>
  </form> 
</body>
</html>
```

das wäre die richtige Lösung. Hab an den geänderten Stellen Kommentare eingefügt.
Falls du was nicht verstehst einfach Fragen.

MFG

PS:  hups! hab versehentlich insertion.Sort statt selection Sort gemacht


----------

