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