sortieren



  • hallo,

    ich habe ein grosses char array in dem lauter worte stehen... diese will ich nun alphabetisch ordnen.

    ich hab mich entschieden das ganze mit selection sort zu sortieren, da ist alles auch gar kein problem wenn alle woerter nur aus einem buchstaben bestehen, wie etwa: a, z, b, g

    wenn ich allerdings komplexere woerter wie: aab, bcz, ggh habe schaffe ich diese nicht mehr. ich weiss einfach nicht wie ich das realisieren kann.

    bis jetzt sieht das alles so aus

    for(i = 0; i < len; i++)
            {
                    for(j = 0; j < len; j++)
                    {
                            if(to_sort[i] < to_sort[j])
                            {
                                    wert = to_sort[i];
                                    to_sort[i] = to_sort[j];
                                    to_sort[j] = wert;
                            }
                    }
            }
    

    aber wie schaffe ich es nun mehrbuchstabige woerter zu sortieren?
    jemand ideen/hinweise/tipps o.ä.?



  • vergleichsfunktion (strcmp?) basteln, sortieralgo auf den rueckgabewert dieser aufbauen.

    oder du nimmst qsort(), welches teil von C ist.



  • vergleichsfunktion (strcmp?) basteln, sortieralgo auf den rueckgabewert dieser aufbauen.

    hey das hoert sich gut an.

    dankeschoen



  • ich hab mir jetzt eine kleine funktion gebastelt und wollte mal fragen ob jemand diese einmal durchschauen kann, ob alles richtig laeuft, oder ob ich doch etwas falsch gemacht habe. soweit ich es getest habe funktioniert alles, aber man uebersieht ja doch mal schnell etwas...

    for(j = 0; j < i; j++)
    {
    	for(k = 0; k < i; k++)
    	{
    		if((event = str_cmp(data[j]->name, data[k]->name)) == 1)
    		{
    				temp = data[j];
    				data[j] = data[k];
    				data[k] = temp;
    		}
    	}
    }
    
    int str_cmp(char *to_cmp1, char *to_cmp2)
    {
    	int i = 0;
    
    	if(to_cmp1[0] < to_cmp2[0])
    	{
    		return 1;
    	}
    
    	while(to_cmp1[i] == to_cmp2[i] && to_cmp1[i] != '\0' && to_cmp2[i] != '\0')
    	{
    		i++;
    	}
    
    	if(to_cmp1[i] < to_cmp2[i])
    	{
    		return 1;
    	}
    
    	return 0;
    }
    


  • das echte strcmp() kann auch negative werte zurueckgeben.
    dein erstes if im str_cmp ist unnoetig, weil es ein nicht-spezialfall des folgenden while ist.

    so wuerde ich strcmp machen:

    int mystrcmp(char *a, char *b)
    {
        while (*a && *b && (*a == *b)) ++a, ++b;
        return *a - *b;
    }
    

Anmelden zum Antworten