Sortiranje¶
Primjer: sortiranje polja stringova tako da se prvi znak u stringu ignorira.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char L[32][32];
int usporedba( char* a, char* b )
{
return strcmp( a+1, b+1 ); //sortiranje ignorirajući
} //prvi znak
main()
{
strcpy( L[0], ".kruska" );
strcpy( L[1], "-jabuka" );
strcpy( L[2], "*limun" );
qsort( L, 3, 32,
(int(*)(const void*,const void*))usporedba );
int i;
for( i=0; i<3; i++ )
printf( "%d %s\n", i, L[i] );
}
0 -jabuka
1 .kruska
2 *limun
|
from functools import cmp_to_key
def cmp( a, b ):
return (a>b) - (a<b)
def usporedba( a, b ):
return cmp(a[1:],b[1:])
L = [".kruska", "-jabuka", "*limun" ]
L.sort( key=cmp_to_key(usporedba) )
for i,s in enumerate(L):
print(f"{i} {s}")
0 -jabuka
1 .kruska
2 *limun
Pythonskiji način bi bio koristiti funkciju koja generira ključ po kojem će se sortirati: def kljuc( a ):
return a[1:]
L = [".kruska", "-jabuka", "*limun" ]
L.sort( key=kljuc )
for i,s in enumerate(L):
print(f"{i} {s}")
0 -jabuka
1 .kruska
2 *limun
|
sorted()
vs. list.sort()
def kljuc( a ): return a[1:] L = [".kruska", "-jabuka", "*limun" ] print(sorted(L)) print(sorted(L, key=kljuc)) print(sorted(L, reverse=True)) print(sorted(L, key=kljuc, reverse=True)) print(L)['*limun', '-jabuka', '.kruska'] ['-jabuka', '.kruska', '*limun'] ['.kruska', '-jabuka', '*limun'] ['*limun', '.kruska', '-jabuka'] ['.kruska', '-jabuka', '*limun']
Vidimo da za razliku od metode list.sort()
(vidi tablicu Mutable Sequence Types)
iz prvog primjera,
funkcija sorted()
nije promijenila početnu listu L
. (list.sort()
dakle radi in-place sort, a sorted()
stvara još jednu listu.) Također vidimo kako opcija reverse
može poslužiti za promjenu redoslijeda.
Literatura