1 Standardalgoritmer En algoritm är en beskrivning av en metod för att låsa någon uppgift. Man specificerar indata och utdata. Indatat ges av metodargument och utdata ges som regel av returtypen. 1.1 Swap En swap innebär att man byter innehållet i två variabler eller objekt. Den beskrivs inte som en metod utan skrivs i det programavsnitt där det behövs. Ex int i = 4; int j = 9; // j innehåller 9, i innehåller 4 // swap int tmp = i; i = j; j = tmp; // j innehåller 4, i innehåller 9 Om ma istället vill använda String-objekt String s1 = "Hello"; String s2 = "World"; // s1 innehåller Hello och s2 innehåller World // swap String tmp = s1; s1 = s2; s2 = tmp; // s1 innehåller World och s2 innehåller Hello 1.2 Sök minsta värdet i en array En metod som söker efter det minsta värdet i en array av flyttal. Funktionen returnerar det index som det minsta talet befinner sig på. Indata: En array med värden Utdata: index för det minsta elementet Algoritmen antag att det minsta talet m befinner sig på den första positionen index i=0 iterera igenom övriga element, om ett mindre tal än m upptäcks, låt m vara det mindre talet, och i motsvarande index. Då arrayen är genomlöpt har det minsta elementet funnits Algoritmen är användbar för alla värden som kan ordnas i någon ordning. Algoritmen kan formuleras för flyttal med en metod som har signaturen int findmin(double [] array) Exempel
import java.util.*; public static int findmin(double [] array){ int min = 0; for(int i =1; i<array.length; i++){ if ( array[i]<array[min]){ double myarray[]= new double[10]; System.out.println("Mata in tal nr " + (i+1) ); myarray[ i ]= keyb.nextdouble(); int minpos = findmin(myarray); System.out.println("Minsta värdet finns på position:"+ minpos); 1.2.1 Övning: Skriv om programmet så att det även letar rätt på det största värdet. Definiera en metod findmax på samma sätt som findmin. 1.3 Array sortering En enkel metod att sortera element i en array är metoden sök-minsta-byt. Metoden går ut på att man börjar med att leta igenom hela arrayen efter det minsta elementet i arrayen, man tar då det minsta elementet och byter plats med elementet först i arrayen. Man kan nu betrakta detta första element som att vara sorterat. Den osorterade delen av arrayen är nu alla element utom det sista. Den kvarvarande sorteringsuppgiften är alltså att sortera en array som består av ett färre element än tidigare. Proceduren upprepas på denna mindre array, tills bara ett element återstår. Detta ensamma element är även det i ordning. Metoden sorterar arrayen i stigande ordning. Efter att det första minsta elementet funnits, byter vi plats på det minsta och första elementet. I nästa steg betraktar vi inte fältets första element eftersom det redan sorterats. Före byte 3.0 2.14 9.3 5.0 4.98 1.2 3.4 3.8 2.6 0 1 2 3 4 5 6 7 8 Efter byte 1.2 2.14 9.3 5.0 4.98 3.0 3.4 3.8 2.6 0 1 2 3 4 5 6 7 8 Elementet på index 0 är sorterat, vi behöver därefter bara betrakta element 1-8 Sökningen efter det minsta elementet måste därför börja från position ett, inte position noll som tidigare. På grund av detta måste vi inkludera detta startindex i vår sökminsta-algoritm.
1.3.1 Algoritm Sortering sök minsta, byt (selection sort) Indata: en array med flyttal, kalla elementen e0... en. en är sista elementet, e0 är första Utdata: den sorterade arrayen - Iterera över alla element e0... en-1 (första till näst sista), kalla aktuellt element ei o Finn det minsta elementet emin i fältet ei till en o Byt värden på elementet emin och ei import java.util.*; public static int findmin(double [] array, int startindex){ int min = startindex; for(int i =startindex+1; i<array.length; i++){ if ( array[i]<array[min]){ public static void sort(double [] array){ for(int i = 0; i<array.length-1;i++){ // sök minsta int idx = findmin(array, i); // byt double tmp=array[idx]; array[idx]=array[i]; array[i]=tmp; double myarray[]= new double[10]; System.out.println("Mata in tal nr " + (i+1) ); myarray[ i ]= keyb.nextdouble(); sort(myarray); System.out.println("De inmatade värdena sorterade:"); System.out.println(i+":"+myArray[i] ); Resultatet av algoritmen är den sorterade arrayen. Sorteringen sker dierkt i arrayen och ges därför inte som ett returnvärde. 1.3.2 Övning: Skriv om funktionen så att den sorterar i fallande ordning. Exempel: Sortera inmatade namn i alfabetisk ordning
Algoritmen är densamma. Den väsentliga skillnaden är hur jämförelsen sker i findmin. En Stringinstans jämförs med en annan med compareto, eller comparetoignorecase. String s1 = "Hallå"; String s2 = "Hello"; if ( s1.compareto( s2 ) < 0 ){ System.out.println("Hallå är före Hello"); else{ System.out.println("Hallå är efter Hello"); Avsnittet ger som resultat att Hallå är före Helllo. En egenhet vid jämförelser av texter är att små bokstäver, gemener, kommer efter versaler. Det har att göra med hur teckentabellen är uppställd. Metoden comparetoignorecase tar ingen hänsyn till gemen/versal vid jämförelsen. String s1 = "hallå"; String s2 = "Hello"; if ( s1.compareto( s2 ) < 0 ){ System.out.println("hallå är före Hello"); else{ System.out.println("hallå är efter Hello"); if ( s1.comparetoignorecase( s2 ) < 0 ){ System.out.println("hallå är före Hello"); else{ System.out.println("hallå är efter Hello"); Första jämförelsen ger hallå är efter Hello, den andra jämförelsen ger hallå är före Hello.
import java.util.*; public static int findmin(string [] array, int startindex){ int min = startindex; for(int i =startindex+1; i<array.length; i++){ if ( array[i].compareto(array[min]) < 0){ public static void sort(string [] array){ for(int i = 0; i<array.length-1;i++){ // sök minsta int idx = findmin(array, i); // byt String tmp=array[idx]; array[idx]=array[i]; array[i]=tmp; String myarray[]= new String[5]; System.out.println("Mata in namn " + (i+1) ); myarray[ i ]= keyb.next(); sort(myarray); System.out.println("De inmatade namen sorterade:"); System.out.println( myarray[i] );