Ergebnis 1 bis 3 von 3

Thema: Sortierung

  1. #1
    Trojaner
    Registriert seit
    04.03.2007
    Beiträge
    82

    Standard

    Ich fange gerade mit Perl an und versuche den Inhalt eines Arrays zu sortieren. Das klappt meistens auch, nur manchmal stimmen die letzten Stellen komischerweise nicht.
    Ich weiß, dass es dafür eine Funktion gibt, aber ich möchte gerne wissen, wo bei mir der Fehler liegt.

    Code:
    #!/usr/bin/perl5.8.8
    
    @array=();
    for ($s=0; $s<50; $s++)
    {
    	@array[$s]=(int rand(10));
    }
    
    
    $acount=@array;
    $temp=0;
    $vergleichswert1=0;
    $vergleichswert2=0;
    
    print "@array\n";
    
    for ($i=0; $i<$acount; $i++)
    {	
    	for ($i2=0; $i2<$acount; $i2++)
    	{		
    		if ($array[$vergleichswert1] >= $array[$vergleichswert2])
    		{
    			$vergleichswert2++;
    		}
    		else
    		{
    			$temp=$array[$vergleichswert2];
    			$array[$vergleichswert2]=$array[$vergleichswert1];
    			$array[$vergleichswert1]=$temp;
    			$temp=0;
    		}
    	}
    	$vergleichswert1++;
    	$vergleichswert2=0;
    }
    print "@array\n";
    Danke schon mal im voraus

    Added after 23 hours 58 minutes:

    Hat keiner eine Idee ?

  2. #2
    Anfänger
    Registriert seit
    01.08.2008
    Beiträge
    27

    Standard

    Hey,

    Bin neu hier und mache auch viel in Perl.
    Versuch das hier:

    Code:
    #!/usr/bin/perl
     
    @array;
    
    for($i=0;$i<50;$i++)
    {
      $array[$i]=(int rand(10));
    }
    
    $acount=@array;
    print "@array\n\n";
    
    for($i=0;$i<$acount;$i++)
    {
      for($j=0;$j<$acount;$j++)
      {
        if($array[$i]<$array[$j])
        {
          $temp=$array[$i];
          $array[$i]=$array[$j];
          $array[$j]=$temp;
        }
      }
    }
    
    print "@array\n";
    Zur Erklärung:

    Dein Fehler ist in dieser Schleife:



    Code:
    for ($i2=0; $i2<$acount; $i2++)
       {      
          if ($array[$vergleichswert1] >= $array[$vergleichswert2])
          {
             $vergleichswert2++;
          }
          else
          {
             $temp=$array[$vergleichswert2];
             $array[$vergleichswert2]=$array[$vergleichswert1];
             $array[$vergleichswert1]=$temp;
             $temp=0;
          }
       }
    Die Variable $vergleichswert2 wird nur erhöht wenn nichts getauscht werden muss. Wenn z.B 10 mal getauscht werden muss ist die Schleife nach 49 durchläufen erst bei der Variable $array[39]. Da die Zählervariable ($i2) nach jedem Durchlauf erhöht wird bricht die Schleife ab obwohl sie noch nicht beim letzten Element ist.

    Den Fehler kann man beheben indem man im else-Zweig entweder die Zeile
    Code:
    $vergleichswert2++;
    oder die Zeile
    Code:
    $i2--;
    einfügt.

  3. #3
    Trojaner
    Registriert seit
    04.03.2007
    Beiträge
    82

    Standard

    Hallo,

    danke für deine Antwort. Hatte ich erst gar nicht gesehen, da ich dachte, dass es eh keinen Interessiert. Ich habe meinen Fehler gefunden und ihn korrigiert. So funktioniert es:

    Code:
    #!/usr/bin/perl5.8.8
    
    @array=();
    for ($s=0; $s<10000; $s++)
    {
    	@array[$s]=(int rand(100));
    }
    
    $acount=@array;
    $temp=0;
    $vergleichswert1=0;
    $vergleichswert2=0;
    
    print "@array\n";
    
    for ($i=0; $i<$acount; $i++)
    {	
    	for ($i2=0; $i2<=$acount; $i2++)
    	{		
    		if ($array[$vergleichswert1] >= $array[$vergleichswert2])
    		{
    			$vergleichswert2++;
    		}
    		else
    		{
    			$temp=$array[$vergleichswert2];
    			$array[$vergleichswert2]=$array[$vergleichswert1];
    			$array[$vergleichswert1]=$temp;
    			$temp=0;
    		}
    	}
    	$vergleichswert1++;
    	$vergleichswert2=0;
    }
    print "@array\n";
    Dann habe ich mich noch an etwas anderem probiert, was um einiges schneller ist, und auch einwandfrei funktioniert:

    Code:
    #!/usr/bin/perl 
    #Programm funktioniert
    use strict;
    
    our @array = map { int(rand()*100) } (1..$ARGV[0]);
    print "Zahlen unsortiert:\n @array\n";
    
    quicksort(0, $#array);  
    sub quicksort
    {
    	my ($links ,$rechts) = @_;
    	my $pivot = int ($array[($links + $rechts) / 2]);
    	my $l = $links;
    	my $r = $rechts;
    	my $i;
    	do {
    		while ($array[$l] < $pivot) { $l++; }	
    		while ($array[$r] > $pivot) { $r--; }
    		if ($l <= $r) {
    			vertauschen($l, $r);
    			$l++;
    			$r--;
    		}
    	   }while (($l <= $r));
    	if($links < $r) { quicksort($links,  $r); }
    	if($l < $rechts) {quicksort($l, $rechts); }  
    }
    sub vertauschen
    {
    	my ($l, $r) = @_;
    	my $temp;
    	
    	$temp = $array[$l];
    	$array[$l] = $array[$r];
    	$array[$r] = $temp;
    }
    print "Zahlen sortiert:\n @array\n";
    In dem Sinne...
    Dok

Stichworte

Berechtigungen

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