Programmeringsteknik för K och Media 1999-11-17 Föreläsning 7 Sökning (Kap 13.2) Linjärsökning Binärsökning Sortering (Kap 13.1) Urvalssortering Insättningssortering Linda Kann, Nada
Strängjämförelse För jämförelse av strängar finns metoderna public boolean equals(String s) public boolean equalsIgnoreCase(String s) För att avgöra bokstavsordning finns public int compareTo(String s) Anropet s1.compareTo(s2) ger negativt värde om s1 kommer före s2 positivt värde om s1 kommer efter s2 noll om strängarna är lika
Linjärsökning Var i en vektor finns ett visst värde? För String finns metoden indexOf(char c) som ger index för första förekomsten av tecknet c eller –1 när tecknet inte finns. När vektorn inte är sorterad är det lämpligt att undersöka värdena i tur och ordning. Det kallas linjärsökning (linear search).
Linjärsökning - metod //Söker med linjärsökning efter nyckel //Om nyckel inte finns returneras -1 public int linjSök(int nyckel) { for (int i=0; i<n; i++) if (v[i]==nyckel) return i; return -1; }
Binärsökning När vektorn är sorterad kan man söka snabbare. Algoritm: Beräkna intervallets mittpunkt. Avgör om det sökta värdet finns i första eller andra halvan och fortsätt söka där. Upprepa tills du hittar det sökta värdet eller tills intervallet krympt till ingenting (då fanns inte det sökta värdet med).
Binärsökning - metod public int binSök(int nyckel) { int min=0; int max=n-1; while (min<max) { int mitt=(min+max)/2; if (v[mitt]==nyckel) return mitt; else if (v[mitt]<nyckel) min=mitt+1; max=mitt-1; } return -1;
Urvalssortering En enkel metod för att sortera n värden. Algoritm: Välj ut det minsta värdet. Byt plats på minsta och första värdet. Fortsätt på samma sätt med resten av värdena. 14 17 14 19 13
Urvalssortering - metod //Sorterar hela vektorn v public void urvalsSortera() { for (int i=0; i<n-1; i++) { int min=i; for (int j=i+1; j<n; j++) if (v[j]<v[min]) min=j; int temp=v[min]; v[min]=v[i]; v[i]=temp; }
Insättningssortering En enkel metod för att sortera in ett nytt värde i en redan sorterad vektor med. Algoritm: Är värdet större än det sista värdet? Lägg isåfall det nya värdet sist och allt är klart. Annars: Börja från slutet av vektorn och flytta värden ett steg (från plats i till plats i+1) tills det nya värdet är större än värdet på plats i. 13 14 14 17 19
Insättningssortering - metod //Sorterar in talet nytt på rätt plats i vektorn v public void sättIn(int nytt) { int i=n-1; if (n==0) v[0]=nytt; else { while (i>=0 && nytt<v[i]) { v[i+1]=v[i]; i--; } v[i+1]=nytt; n++;
Sökning - prestanda Linjärsökning en vektor med n element kräver maximalt n jämförelser. Binärsökning i en vektor med n element kräver maximalt 2logn jämförelser. För stora vektorer går alltså binärsökning betydligt snabbare, vilket är ett skäl till att man ofta vill ha sorterade vektorer.
Sortering - prestanda Insättningssortering och urvalssortering av n värden kräver max n2/2 jämförelser. Det finns snabbare metoder för sortering, som bara kräver n 2log n jämförelser.