Sortieren eines arrays



  • Hallo, ich habe diese Funktion geschrieben aber es stuerzt immer aus mir unerklaerlichen gruenden ab. Findet einer von euch den Fehler ? Die Time-Geschichte hab ich noch nicht weitergemacht aber daran wird es wohl nicht liegen. Das Programm stuerzt irgendwo in der Funktion ab. Shakersort soll das werden.

    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void  shakesort(int n, float a[]);
    
    int main()
    {
    	int i;
    	clock_t tm1, tm2;
    	float a[1000];
    
    	for(i=0; i<1000; i++)
    	{
    		a[i] = (float)rand();
    		printf("\n %.2f", a[i]);
    	}
    
    	shakesort(1000, a);
    
    	for(i=0; i<1000; i++)
    	{
    		printf("\n %.2f", a[i]);
    	}
    
    	return 0;
    
    }
    
    void shakesort(int n, float a[])
    {
    	int i;
    	int lower, higher, right;
    	float temp;
    
    	lower = 1;
    	higher = n-1;
    	right = n-1;
    
    	while (lower <= higher)
    	{
    		for (i = lower; i <= higher; i++)
    		{
    			if (a[i-1] > a[i])
    			{
    				temp = a[i];
    				a[i] = a[i-1];
    				a[i] = temp;
    				right = i;
    			}
    		}
    			lower = right;
    
    		for (i = higher; i <= lower; i--)
    		{
    			if (a[i-1] > a[i])
    			{
    				temp = a[i];
    				a[i] = a[i-1];
    				a[i] = temp;
    				right = i;
    			}
    		}
    		higher = right;
    	}
    }
    


  • Auf Anhieb fällt mir nur auf, daß die Bedingung der zweiten for()-Schleife falsch ist. Aber das dürfte kein Absturzgrund sein.

    (eventuell solltest du auch dazusagen, mit was für einer Meldung das Programm abstürzt)



  • Die Fehlermeldung ist eine einfacher Windows-Fenster das jeder kennt wo man den Problembericht senden kann. Die ist falsch ? jo, die war falsch, hab sie korrigiert. Nu stuerzt das Prog auch nicht mehr ab, aber sortieren tut er trotzdem nicht 😞

    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void  shakesort(int n, float a[]);
    
    int main()
    {
    	int i;
    	clock_t tm1, tm2;
    	float a[1000];
    
    	for(i=0; i<1000; i++)
    	{
    		a[i] = (float)rand();
    		printf("\n %.2f", a[i]);
    	}
    
    	shakesort(1000, a);
    
    	for(i=0; i<1000; i++)
    	{
    		printf("\n %.2f", a[i]);
    	}
    
    	return 0;
    
    }
    
    void shakesort(int n, float a[])
    {
    	int i;
    	int lower, higher, right;
    	float temp;
    
    	lower = 1;
    	higher = n-1;
    	right = n-1;
    
    	while (lower <= higher)
    	{
    		for (i = lower; i <= higher; i++)
    		{
    			if (a[i-1] > a[i])
    			{
    				temp = a[i];
    				a[i] = a[i-1];
    				a[i] = temp;
    				right = i;
    			}
    		}
    			lower = right;
    
    		for (i = higher; i >= lower; i--)
    		{
    			if (a[i-1] > a[i])
    			{
    				temp = a[i];
    				a[i] = a[i-1];
    				a[i] = temp;
    				right = i;
    			}
    		}
    		higher = right;
    	}
    }
    


  • Hmm, normalerweise hast Du eine Variable right und eine Variable left beim Shakersort. Die sind quasi Deine Obergrenzen. Du wechselst jetzt immer zwischen dem Sortieren von links nach rechts, dann von rechts nach links. Die jeweilige Obergrenze wird dann immer um 1 nach jeder Zählschleife(for) reduziert.

    Sollte dann irgendwann die Bedingungsschleife (right >= left) nicht mehr zutreffen, haben sich sozusagen die beiden Sortiervorgänge in der Mitte getroffen und das Array ist sortiert.

    Bringt Dir zeitlich aber überhaupt nichts. Hab ich gerade ausprobiert. Spaßig ist es dann, das Shakersort mit dem Insertionsort zu kombinieren. Also statt der Vertauschungen, Verschiebungen vorzunehmen.
    Hat da jemand eine Idee?


Anmelden zum Antworten