Jakolajittelu (Radix sort) Vertailu tehdään avaimen osien perusteella Avaimia käsitellään R-kantaisina arvoina esim. postin lajittelukone prosessoi lähetykset.

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

18. Abstraktit tietotyypit
Copyright  Hannu Laine Bittitason-operaatiot Hannu Laine.
Tietorakenteet ja algoritmit
Tietokonetekniikka 4 Tieto ja tiedon talletus
15. Loogiset operaatiot.
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
© Hannu Laine 1 Tietorakenteet ja algoritmit Funktio-osoittimet Funktio-osoittimen ja taulukko-osoittimen vertailu Funktio-osoittimen käyttötapoja.
JavaScript (c) Irja & Reino Aarinen, 2007
Tietorakenteet ja algoritmit
2.8.3 Abstraktit tietotyypit
Markku Siermala, IMT Bioinformatiikan koulutusohjelma
Tavanomaisimpien tietorakenteiden ja algoritmien testauksesta
521144A, Algoritmit ja Tietorakenteet, syksy 2013
Taulukoiden määrittely, käsittely ja kopiointi Vaihtoehdot taulukoille
ATK70d / Ohjelmointi 1 Kuplalajittelu © Helia / Jukka Harju, 2004.
Sisältö: Johdanto kryptografiaan Salakirjoitus
C-ohjelmointi, kevät 2006 Taulukot Binääritiedostot Luento
M-ary Phase Shift Keying Timo Mynttinen1 M-ary Phase Shift Keying M-ary FSK:ssa huomattiin, että on mahdollista lähettää kaksi tai useampi symbolitila.
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1.
Toiston tekeminen Javalla  Mikä toistorakenne on?  while toistorakenne  do-while toistorakenne  for toistorakenne 1.
TAULUKKO YKSIULOTTEINEN TAULUKKO. TAULUKKO  Taulukon tarkoitus Ohjelmassa tarvitaan paljon samantyyppisiä samaan kohdealueeseen kuuluvia muuttujia Näitä.
Binäärinen hakupuu Jokaisessa solmussa on yksikäsitteinen avain
Muistinhallinta. 2 Teknisiä kehitysaskelia §Muisti- ja osoiteavaruuden erottaminen toisistaan l virtuaaliosoitteiden avulla muistin koko voi olla suurempi.
Tiedon esittäminen.
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
Tietovuokaaviot (ei osa UML-kieltä)
Erilaiset liitokset FROM-osassa voidaan määritellä relaatio myös erilaisia liitosoperaatioita käyttäen Vasen, oikea ja täysi puoliliitos eli ulkoliitos.
Miika Nurminen, Kerho -alusta() : void +lue_tiedostosta(tied : String) : String +talleta() : String +kerhon_nimi(): String +jasenia() : int +poista(nro:
Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Hyvä ohjelmointitapa (osa 2) Yleistä Lisää hyviä ohjelmointikäytäntöjä: − Jaa pitkä koodi osiin. − Käytä attribuutteja säästeliäästi.
Rinnakkaisuus Järjestelmässä, jossa voi olla useita prosesseja rinnakkain suorituksessa voi tulla tilanteita, joissa prosessien suoritusta täytyy kontrolloida.
Johdatus ohjelmointiin – C kielen peruselementit Tutkijayliopettaja Manne Hannula Opetusharjoittelu (ohjaava opettaja Jukka Jauhiainen)
Johdetun luokan olion esittely... tMyn1 Johdetun luokan olion esittely ja määrittely Esittelyluokka tarkoittaa olion tunnuksen luokkaa. Määrittelyluokka.
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
Antti-Jussi Lakanen Nuorten peliohjelmointi 2009 / Jyväskylän yliopisto.
Kolme tapaa sopia symmetrisestä avaimesta
XSL Teppo Räisänen
XSL Teppo Räisänen
15. Ohjelmoinnin tekniikkaa
Listat eli luettelot listaelementit ovat lohkoelementtejä:  lista ja listan alkiot alkavat uudelta riviltä  listan jälkeen tuleva elementti alkaa uudelta.
21. Rekursio.
Lajittelu: peruskäsitteet
Ohjausrakenteet Määräävät ohjelmakoodin suoritusjärjestyksen Ehtolause if – else on muotoa if (lauseke) lause1 else lause2 Jos lauseke on tosi, niin suoritetaan.
Prioriteettijonot ja kekolajittelu (heapsort)
Kuplalajittelu (bubble sort)
Puun määritelmä Puu on yhden tai useamman kytketyn solmun muodostama hierarkinen joukko Lehtisolmuista juurisolmuun on yksikäsitteinen polku Käytetään.
Lajittelun sovelluksia Yksilöllisyyden testaaminen Kopioiden poistaminen Mediaani/n:ksi suurimman valinta frekvenssien laskenta/yleisin alkio, l.moodi.
Hajoita ja hallitse (divide and conquer) Pikalajittele n-alkioinen taulukko 1. Divide: Jaetaan taulukko kahdeksi alitaulukoksi tukialkion (pivot) x suhteen:
Hajakoodaus Talletetaan alkiot avain-indeksoituun taulukkoon Hajakoodausfunktio Menetelmä avain-indeksin laskemiseen avaimesta Törmäyksen selvitysstrategia.
Merkkijono Sekvenssi merkkejä aakkostosta: - binäärinen {0, 1} -ASCII, UNICODE Sovelluksia: - Tekstinkäsittely - Digitaalinen kirjasto - Laskennallinen.
Muuttujan osoite int a=1; 0xbfffea64 /* tulostetaan a:n osoite*/ printf(“%p\n”, &a); 0xbfffea68 /* tulostetaan a:n osoite + 1*/ printf(“%p\n”, &a+1); /*
Linkitetty lista Joukko alkioita jotka on kytketty toisiinsa linkeillä Listan alkio sisältää talletettavan datan ja linkin seuraavan alkioon Alkion lisääminen.
Usein aliohjelman kutsun tulos ei riipu pelkästään eksplisiittisistä syötteistä vaan myös moduulin tai olion tilasta (state). ● Tila määräytyy yleensä.
Symbolitaulut Joukko hakuavaimen omaavia tietueita LISÄÄ uusi tietue ETSI tietue hakuavaimen perusteella Sovelluksia: Spell checker etsii sanoja sanakirjasta.
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembler.
Kerrannaisyksiköiden tunnukset kilo, k, tuhat hehto - h, sata deka da, kymmenen yksi desi d, ,1 kymmenesosa sentti.
String-vertailusta ja Scannerin käytöstä (1/2)
8. Rekursio.
Poikkeustenkäsittelylohkot try-catch
Yhden bitin asettaminen Javalla
Siirtorekisterin toteutus Javalla
13. Loogiset operaatiot.
Määritä särmiön tilavuus
8. Rekursio.
KVANTISOINTIKOHINA JA AWGN-KOHINAN vaikutus PULSSIKOODIMODULAATIOSSA
13. Loogiset operaatiot.
Esityksen transkriptio:

Jakolajittelu (Radix sort) Vertailu tehdään avaimen osien perusteella Avaimia käsitellään R-kantaisina arvoina esim. postin lajittelukone prosessoi lähetykset viisinumeroisen postinumeron ensimmäisen numeron perusteella kymmeneen pinoon: yhdessä on 0:lla alkavat toisessa on 1:llä alkavat, jne. Sama prosessi voidaan rekursiivisesti toistaa yksittäisille pinoille käyttäen postinumeron toista numeroa (R=10)

Jakolajittelun lähestymistavat Eniten merkitsevän numeron jakolajittelu Tutkivat minimimäärän informaatiota lajittelun suorittamiseksi Yleistävät pikalajittelun Vähiten merkitsevän numeron jakolajittelu Numeroita tutkitaan oikealta vasemmalle

Binäärisen pikalajittelun eteneminen A00001 S10011 O01111 R10010 T10100 I01001 N01110 G00111 E00101 X11000 A00001 M01101 P10000 L01100 E00101 A00001 E00101 O01111 L01100 M01101 I01001 N01110 G00111 E00101 A00001 X11000 T10100 P10000 R10010 S10011 A00001 E00101 A00001 E00101 G00111 I01001 M01101 N01110 L01100 O01111 S10011 T10100 P10000 R10010 X11000 A00001 A00001 E00101 E00101 G00111 I01001 N01110 M01101 L01100 O01111 S10011 R10010 P10000 T10100 X11000 A00001 A00001 E00101 E00101 G00111 I01001 L01100 M01101 N01110 O01111 P10000 R10010 S10011 T10100 X11000 A00001 A00001 E00101 E00101 G00111 I01001 L01100 M01101 N01110 O01111 P10000 R10010 S10011 T10100 X11000

Binäärisen pikalajittelun bittipuu Seuraamalla polkua juuresta solmuun ja ottamalla 0:n vasemmille haaroille ja 1:n oikeille haaroille saadaan avaimen bitit jotka erottavat sen muista avaimista A00001 A00001 E00101 E00101 G00111 I01001 L01100 M01101 N01110 O01111 P10000 R10010 S10011 T10100 X11000 X T LMRSNO A EG I P

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } Jaetaan tiedosto avaintavun eniten merkitsevän bitin perusteella, jonka jälkeen lajittelua jatketaan rekursiivisesti.

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 110…0 010…0 110…0 010…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 110…0 010…0 110…0 010…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 110…0 010…0 110…0 010…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 110…0 010…0 110…0 010…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 110…0 010…0 110…0 010…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=0, j=3

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=1, j=3

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=2, j=3

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=2, j=3

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=2, j=2

Binäärinen pikalajittelu #define bittejasanassa 32 #define bittejatavussa 8 #define tavujasanassa 4 #define bitti(A, B) (((A) >> (B)) & 1) void binpikalajittelu(alkio a[], int l, int r, int w) { int i = l, j = r; if(r <= l || w < 0) return; while(j != i) { while(bitti(a[i], w) == 0 && i < j) i++; while(bitti(a[j], w) == 1 && j > i) j--; VAIHDA(a[i], a[j]); } if(bitti(a[r], w) == 0) j++; binpikalajittelu(a, l, j - 1, w - 1); binpikalajittelu(a, j, r, w - 1); } void lajittelu(alkio a[], int l, int r) { binpikalajittelu(a, l, r, bittejasanassa - 1); } 010…0 010…0 110…0 110…0 a[0] a[1] a[2] a[3] l=0, r=3, w=31 LSB (0) MSB (31) i=2, j=2 a[i]:n w:nen bitin arvo on 1 paitsi, jos kaikki w:net bitit ovat nollia

Eniten merkitsevän numeron jakolajittelun eteneminen ace ago and bet cab caw cue dim dug egg fee few for gig hut ilk jam jay jot joy ace ago and bet cab caw cue dim dug egg few fee for gig hut ilk jay jam jot joy ace ago and bet cab caw cue dim dug egg for few fee gig hut ilk jam jay jot joy for ilk dim jot hut ace bet egg few jay joy gig cab caw cue fee ago jam dug and

Eniten merkitsevän numeron jakolajittelu #define R (1 << bittejatavussa) #define numero(A, B) A[B] #define lokero(A) l+lkm[A] alkio apu[ALKIOITA_MAX]; void jakolajitteluEMN(alkio a[], int l, int r, int w) { int i, j, lkm[R + 1]; if(w > tavujasanassa) return; if(r - l <= M) { lisayslajittelu(a, l, r); return; } for(j = 0; j <= R; j++) lkm[j] = 0; for(i = l; i <= r; i++) lkm[numero(a[i], w) + 1]++; for(j = 1; j < R; j++) lkm[j] += lkm[j - 1]; /* lkm[j] on ’<j’ alkioiden lkm */ for(i = l; i <= r; i++) apu[l + lkm[numero(a[i], w)]++] = a[i]; for(i = l; i <= r; i++) a[i] = apu[i]; jakolajitteluEMN(a, l, lokero(0) - 1, w + 1); for(j = 0; j < R - 1; j++) jakolajitteluEMN(a, lokero(j), lokero(j + 1) - 1, w + 1); } Johdettu jakaumalajittelusta: avain viittaukset -> viittaukset avaimien osiin + rekursiiviset kutsut numero(a[i], 0)]] on lajiteltavan tiedoston i:nen tietueen eniten merkitsevä tavu Alkiot joiden nykyisen tavun, w, arvo on j ovat välillä [lokero(j),lokero(j+1))

Vähiten merkitsevän numeron jakolajittelun eteneminen ace ago and bet cab caw cue dim dug egg fee few for gig hut ilk jam jay jot joy cab jam caw jay ace fee bet few egg ago gig dim ilk and for jot joy cue dug hut cab and ace cue fee egg gig dug ilk dim jam ago for jot hut bet few caw jay joy for ilk dim jot hut ace bet egg few jay joy gig cab caw cue fee ago jam dug and

Jakolajittelun oikeellisuus Oletetaan että luvut on lajiteltu t-1 vähiten merkitsevät numeron perusteella

Jakolajittelun oikeellisuus Oletetaan että luvut on lajiteltu t-1 vähiten merkitsevät numeron perusteella Lajitellaan t:n numeron perustella: Luvut joilla on eri t:s numero lajitellaan oikein, eikä t-1:llä arvolla ole merkitystä

Jakolajittelun oikeellisuus Oletetaan että luvut on lajiteltu t-1 vähiten merkitsevät numeron perusteella Lajitellaan t:n numeron perustella: Luvut joilla on eri t:s numero lajitellaan oikein, eikä t-1:llä arvolla ole merkitystä Luvut joilla on sama t:s numero laitetaan syötteen mukaiseen järjestykseen => oikea järjestys

Vähiten merkitsevän numeron jakolajittelu alkio apu[ALKIOITA_MAX]; void jakolajitteluVMN(alkio a[], int l, int r) { int i, j, w, lkm[R + 1]; for(w = tavujasanassa - 1; w >= 0; w--) { for(j = 0; j <= R; j++) lkm[j] = 0; for(i = l; i <= r; i++) lkm[numero(a[i], w) + 1]++; for(j = 1; j < R; j++) lkm[j] += lkm[j - 1]; for(i = l; i <= r; i++) apu[lkm[numero(a[i], w)]++] = a[i]; for(i = l; i <= r; i++) a[i] = apu[i]; } Toimii ainoastaan stabiilin lajittelualgoritmin kanssa. Kun avaimet on stabiilisti lajiteltu niiden i:n viimeisen tavun mukaiseen järjestykseen: 1)Ensimmäiset tavut ovat samat => avaimet ovat järjestyksessä stabiiliuden perusteella 2)Ensimmäiset tavut ovat erilaiset => i:n viimeisen tavun mukaisella järjestyksellä ei ole väliä, myöhemmmät iteraatiot järjestävät