Rendezés Java-ban
1. Bemutatkozás
Ebben a cikkben elmélyülünk a vödör rendezési algoritmus. Kezdjük egy gyorssal elmélet, mielőtt a Java megvalósításán dolgozna a megoldásunk tesztelésével. Végül megtesszük nézd meg az idő összetettségét vödör válogatás.
2. A vödörrendezés elmélete
A vödrös válogatás, amelyet néha kuka szerinti válogatásnak is neveznek, egy sajátos rendezési algoritmus. A rendezés úgy működik, hogy az elemeket, amelyeket rendezni szeretnénk, több egyenként rendezett vödörbe osztja szét. Ezzel csökkenthetjük az elemek összehasonlításának számát, és csökkenthetjük a rendezési időt.
Vessünk egy gyors pillantást a a vödörrendezés elvégzéséhez szükséges lépések:
- Állítson be egy tömböt az eredetileg üres vödrökből
- Ossza szét elemeinket a megfelelő vödrökbe
- Rendezzen minden vödröt
- Összekapcsolja a válogatott vödröket a teljes lista létrehozásához
3. Java implementáció
Bár ez az algoritmus nem nyelvspecifikus, a rendezést a Java-ban valósítjuk meg. Menjünk át lépésről lépésre a fenti listán, és írjuk be a kódot az egész számok rendezéséhez.
3.1. Vödör beállítása
Először mi meg kell határoznia egy kivonatoló algoritmust hogy eldöntsük, melyik elemünk melyik vödörbe kerül:
private int hash (int i, int max, int numberOfBuckets) {return (int) ((double) i / max * (numberOfBuckets - 1)); }
A hash-módszerünk definiálásával most megtehetjük adja meg a tárolók számát a bemeneti lista méretének négyzetgyökeként:
végső int számOfBuckets = (int) Math.sqrt (initialList.size ()); Lista vödrök = new ArrayList (numberOfBuckets); for (int i = 0; i <numberOfBuckets; i ++) {buckets.add (új ArrayList ()); }
Végül egy rövid módszerre van szükségünk a maximális egész szám meghatározásához a bemeneti listánkban:
privát int findMax (Lista bemenet) {int m = Egész.MIN_VALUE; for (int i: input) {m = Math.max (i, m); } visszatérés m; }
3.2. Az elemek terjesztése
Most, hogy meghatároztuk a vödröket, megtehetjük terjessze a bemeneti listánk minden elemét a megfelelő csoportba a hash módszer:
int max = findMax (kezdeti lista); for (int i: initialList) {buckets.get (hash (i, max, numberOfBuckets)). add (i); }
3.3. Az egyes vödrök rendezése
Meghatározott és egész számokkal rendelkező vödrökkel használjuk a Összehasonlító válogatni őket:
Összehasonlító összehasonlító = Comparator.naturalOrder (); for (Lista vödör: vödrök) {vödör.sort (összehasonlító); }
3.4. Összevissza vödrünket
Végül össze kell szednünk a vödröket az egységes lista újrateremtéséhez. Mivel a vödrök rendezve vannak, csak egyszer kell végignéznünk az egyes vödröket, és az elemeket hozzá kell fűznünk egy fő listához:
List sortedArray = new LinkedList (); for (Lista vödör: vödrök) {sortedArray.addAll (vödör); } return sortedArray;
4. Kódunk tesztelése
A megvalósításunk befejezésével írjunk egy gyors egységtesztet, hogy megbizonyosodjunk arról, hogy az a várt módon működik:
BucketSorter válogató = new IntegerBucketSorter (); Lista nem rendezve = Arrays.asList (80,50,60,30,20,10,70,0,40,500,600,602,200,15); Várható lista = tömbök. AsList (0,10,15,20,30,40,50,60,70,80,200,500,600,602); Lista rendezve = válogató.sort (rendezetlen); assertEquals (várható, rendezve);
5. Az idő komplexitása
Ezután vessünk egy gyors pillantást a vödörfajta végrehajtásának időbeli összetettségére.
5.1. A legrosszabb esetben
Legrosszabb esetünkben megtalálnánk minden elemünk ugyanabban a vödörben és fordított sorrendben. Amikor ez az eset bekövetkezik, a sorrendet egyszerű sorrendre redukáljuk, amelyben minden elemet összehasonlítunk minden más elemmel, O (n2) időbeli komplexitását eredményezve.
5.2. Átlagos eset forgatókönyv
Átlagos esetünkben azt tapasztaljuk, hogy a az elemek viszonylag egyenletesen oszlanak meg a bemeneti vödrök között. Mivel mindegyik lépésünk csak egy iterációt igényel a bemeneti vázlatainkon keresztül, azt tapasztaljuk, hogy a vödrünk rendeződik O (n) időben befejeződik.
6. Következtetés
Ebben a cikkben azt láttuk, hogyan lehet egy vödör rendezést megvalósítani a Java-ban. Megvizsgáltuk a vödrös rendezési algoritmus időbeli összetettségét is.
Mint mindig, az ebben a cikkben bemutatott kód elérhető a GitHubon.