Sortering Den sorteringsalgoritm som vi använder oss kallas selection sort (urvalssortering) och är en av många existerande sorteringsalgoritmer. Dess funktionssätt beskrivs kanske bäst genom ett konkret scenario: Du befinner dig i ett rum med en bokhylla. Bokhyllan har följande egenskaper: Bokhyllan utgörs av fack där varje fack kan innehålla en och endast en bok. Varje fack har en unik adress i form av ett heltal. Det första facket har adressen 0, det andra har adressen 1, det tredje har adressen 2, och så vidare. Antalet fack är detsamma som antalet böcker. När du kommer in i rummet så står alla böcker i oordning. Din uppgift är att ordningsställa böckerna så att det första facket (adress 0) innehåller den bok som har det tidigaste publikationsåret. Därefter ska böckerna placeras i en sådan ordning att det sista facket innehåller den senast publicerade boken. Annorlunda uttryckt ska du sortera böckerna i stigande ordning med avseende på publikationsår. I det aktuella exemplet innehåller bokhyllan tio böcker och kan schematiskt illustreras enligt nedan: 1989 1969 2001 2004 1994 2001 1921 1983 1978 0 1 2 3 4 5 6 7 8 Till din hjälp har du papper och penna. Ett alternativ är att mer eller mindre planlöst ta dig an uppgiften. Ett annat och i det här sammanhanget bättre alternativ är att gå systematiskt tillväga genom att följa nedanstående steg-för-stegbeskrivning (som i allt väsentligt återspeglar algoritmen selection sort). 1. Det första du ska göra är att placera rätt bok i det första facket (adress 0). Detta fack är din aktuella position. 2. Gör ett antagande om att boken på din aktuella position innehåller det tidigaste publikationsåret. Gör en anteckning om att detta fack innehåller den hittills lägsta publikationsåret. 3. Med start i facket direkt till höger om din aktuella position, sök successivt genom resterande fack om det finns någon bok med tidigare publikationsår genom att jämföra med det fack som du antecknat på pappret. Om detta är fallet, gör en ny anteckning om vilken plats som innehåller det hittills lägsta publikationsåret. 4. När du sökt genom samtliga fack till höger om din aktuella position så byter du plats på den bok som finns på din aktuella position och den bok som finns på den plats som du antecknat på ditt papper. Om din aktuella position är samma plats som finns antecknad på ditt papper så behöver du inte byta plats på böckerna. 5. Din nya aktuella position är platsen direkt höger om din föregående aktuella position. Om din nya aktuella position är det sista facket i bokhyllan så ska du avbryta arbetet (eftersom det är klart). I annat fall ska du återgå till steg 2. Om du följt dessa steg korrekt så ska böckerna nu vara sorterade.
Slumptal.java class Slumptal private int[] tabell; public Slumptal(int antal) tabell = new int[antal]; for (int i = 0; i < antal; i++) tabell[i] = (int)(math.random()*1000.0); public void sortera() int posmin; int temp; for (int i = 0 ; i < tabell.length - 1; i++) posmin = hittaminsta(i); temp = tabell[i]; tabell[i] = tabell[posmin]; tabell[posmin] = temp; private int hittaminsta(int start) int minsta = start; for (int i=start + 1; i < tabell.length; i++) if (tabell[i] < tabell[minsta]) minsta = i; return minsta; public void skrivuttabell() for (int i=0; i < tabell.length; i++) System.out.println(i+": "+tabell[i]); Sortering_1.java class Sortering_1 public static void main(string[] args) Slumptal stal = new Slumptal(10); System.out.println("-------- Osorterad ---------"); stal.skrivuttabell(); stal.sortera(); System.out.println("-------- Sorterad ---------"); stal.skrivuttabell();
ArtikelSamlingSortering.java class ArtikelSamlingSortering public static void main(string[] args) Paper p; PaperCollection pc = new PaperCollection(100); int antalpapers; p = new Paper(); p.setauthor("wexelblat, A."); p.setyear("1995"); p.settitle("an Approach to Natural Gesture in Virtual Environments"); p.setjournal("acm Transactions on Computer-Human Interaction"); p.setvolume("2"); p.setissue("3"); pc.addpaper(p); p = new Paper(); p.setauthor("wolf, C. C."); p.setyear("1992"); p.settitle("a Comparative Study of Gestural, Keyboard, and Mouse Interfaces"); p.setjournal("behaviour and Information Technology"); p.setvolume("11"); p.setissue("1"); pc.addpaper(p); System.out.println("----- Osorterad -----"); antalpapers = pc.getnumberofpapers(); for (int i=0; i < antalpapers; i++) p = pc.getpaper(i); System.out.println(p.getJournal()); pc.sortera(); System.out.println("----- Sorterad med avseende på tidskriftsnamn -----"); for (int i=0; i < antalpapers; i++) p = pc.getpaper(i); System.out.println(p.getJournal()); PaperCollection.java class PaperCollection private Paper[] collection; private int numberofpapers; Nedanstående konstruktor reserverar plats i collection-arrayen för det i parametern angivna antalet Paper-objekt. numberofpapers är ett heltalsattribut som håller ordning på det antal Paper-objekt som lagts till collection-arrayen. public PaperCollection(int maxpapers) collection = new Paper[maxPapers]; numberofpapers = 0;
Nedanstående metod lägger till det Paper-objekt som anges med parametern p. public void addpaper(paper p) collection[numberofpapers] = p; numberofpapers++; Nedanstående metod returnerar det Paper-objekt som finns lagrat i arrayen collection på den position som anges av index-parametern. public Paper getpaper(int index) return collection[index]; Nedanstående metod returnerar antal Paper-objekt som finns lagrat i collection-arrayen. public int getnumberofpapers() return numberofpapers; public void sortera() int posmin; Paper temp; for (int i = 0 ; i < numberofpapers - 1; i++) posmin = hittaminsta(i); temp = collection[i]; collection[i] = collection[posmin]; collection[posmin] = temp; private int hittaminsta(int start) String journal_1; String journal_2; int minsta = start; for (int i=start + 1; i < numberofpapers; i++) journal_1 = collection[i].getjournal(); journal_2 = collection[minsta].getjournal(); //if (journal_1.compareto(journal_2)<0) if (journal_1.comparetoignorecase(journal_2)<0) minsta = i; return minsta;
Övningsuppgifter 1. Skriv ett program som låter användaren mata in ett antal siffror. Skriv sedan ut dem både i stigande och fallande ordning. 2. Modifiera ovanstående program så att användaren får mata in strängar istället. Sortera och skriv ut i både stigande och fallande ordning. 3. Skapa ett program som kan hantera Elever och deras resultat på tentan. Programmet ska bestå av tre klasser. Klassen Elev där ni lagrar information om varje elev. Klassen Kurs som innehåller information om en viss kurs och en array bestående av de elever som är registrerade på kursen. Programmet ska kunna hantera registrering av studenter och deras resultat. Efter avslutad registerting ska eleverna och deras resultat presenteras sorterat efter högsta poäng.