Urejanje po delih (radix sort)

Avtor

Avtor: Matjaž OMAN
Visokošolski strokovni študij Praktična matematika
Študijsko leto 2004/05
 

Viri: Robert Sedgewick Algorithms in Java (Part 1-4), third edition

Kratek opis problema

Kadar želimo urejati podatke, kjer je ključ, ki definira urejenost podatkov zelo zapleten, lahko uporabimo zelo učinkovito metodo urejanja po delih. Metodo urejanja po delih uporabljamo, kadar lahko ključ razbijemo na dele fiksne dolžine (bite, znake, cifre). Urejanje po delih lahko uporabljamo v mnogih primerih: iskanje telefonskih naročnikov v telefonskem imeniku, urejanje igralnih kart, ...

Algoritem

Implementacija algoritma/podatkovne strukture

RadixLSD.java

  public static void lsd(String[] nizi, int L, int R, String zaporedje) {
    String[] temp=new String[nizi.length];
    // ureja od najbolj desnega proti najbolj levemu znaku
    for (int znak=R-1; znak>=0; znak--) {
      // tabela za stetje znako v nizih
      int[] count=new int[zaporedje.length()+1];
      int i;
      for (i=0; i < zaporedje.length()+1; i++) count[i]=0;
      // steje znake v nizih
      for (i=L; i < nizi.length; i++) {
        char c = nizi[i].charAt(znak);
        count[zaporedje.indexOf(c)+1]++;
      }
      // zaporedoma pristeva stevilo znakov
      for (i = 1; i < zaporedje.length()+1; i++)
        count[i] += count[i-1];
      // uredi znake z metodo urejanje s stetjem (key-indexed counting)
      for (i = L; i < nizi.length; i++) {
        char c = nizi[i].charAt(znak);
        temp[count[zaporedje.indexOf(c)]++] = nizi[i];
      }
      // uredi nize
      for (i = L; i < nizi.length; i++)
        nizi[i] = temp[i - L];
    }
  }
    

Primeri

Primer uporabe urejanja po delih, kjer so ključi sestavljeni iz znakov ASCII tabele. RadixLSD_Test.java (RadixLSD.java)

Dodatni komentarji

Če za urejanje posameznih mest ključev uporabimo urejanje s štetjem (key-indexed counting) je časovna zahtevnost tega dela algoritma enaka k=O(i), pri čemer je i število mest v ključih. V tem primeru je časovna zahtevnost celotnega algoritma enaka O(R*n + R*i). In če je R konstanta je časovna zahtevnost celotnega algoritma linearna O(n).