Sortering och Länkade Listor -Varför ? Några algoritmer, kap 8 -En annan typ av datastruktur, Länkad lista. Kap 17. Varför är sortering viktigt? Rekursiv binär sökning public static int binarySearch(Comparable [ ] a, Comparable x) { return binarySearch(a,x,0,a.length-1) ; } private static int binarySearch(Comparable [ ] a, Comparable x, int low, int hight){ if(low>hight) return -1; int mid=low+hight/2 else { if(a[mid].compareTo(x)<0) return binarySearch(a,x,mid+1,hight); // här anropar metod sig själv med högra halvan else if(a[mid].compareTo(x)>0 return binarySearch(a,x,low,mid-1); // här anropar metod sig själv med vänstra halvan else return mid; } Varför är sortering viktigt ? En annan exempel. public static boolean duplicates( int [] a) { for(int i=0;i<a.lenght;i++) for(int j=i+1;j<a.length; j++) if(a[i]=a[j]); return true ; return false; } Om en samling data är sorterad, effektiviteten av alla algoritmer på respektive datan ökar betydligt. En enkel sortering public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ Ex.tiden O( ) a[j]=a[j-1]; Om arrayen är redan } sorterad? a[j]=temp; } Ex.tiden O( ) } insertionSort 8 4 2 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=4 8 4 2 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=4 8 8 2 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=4 8 8 2 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=4 4 8 2 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=2 4 8 2 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=2 4 8 8 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=2 4 8 8 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=2 4 4 8 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=2 4 4 8 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=2 2 4 8 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 2 4 8 7 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=7 2 4 8 8 1 9 3 5 public static void insertionSort(int [] a) { for(int p=1;p<a.length;p++){ int temp=a[p]; int j=p; for (; j>0 && temp<a[j-1] ; j--){ a[j]=a[j-1]; } a[j]=temp; } } 6 temp=7 2 4 7 8 1 9 3 5 6 insertionSort()- speciellt fall 1 2 3 4 5 6 7 Vad blir exekveringstiden när arrayen är sorterad? 8 8 Subkvadratiska sorteringsalgoritmer använder divade & conquer - strategi Merge Sort O( NlogN) Dela arrayen i två halvor, sortera halvorna och sedan sätter ihopp halvorna ( merge) i en sorterad array Quick Sort O(NlogN) Dela arrayen i två delar genom att välja ett element i arrayen som pivot. Element som är mindre en pivoten fyttas till enda delen, element som är större till den andra.Sortera delarna. Divade & Conquer - strategi Att dela ett problem i två mindre subproblem som kan lösas rekursivt Att sätta ihop lösningen till subproblemen för att lösa original problemet. MergeSort -algoritmen 8 4 8 4 8 4 8 2 2 1 9 7 2 4 7 2 3 1 7 1 7 1 9 9 9 6 3 6 3 6 3 6 MergeSort 8 4 4 8 2 1 4 2 2 7 7 7 8 1 9 1 1 3 9 3 6 3 6 6 9 MergeSort 8 4 4 8 2 1 2 2 4 2 7 7 7 8 1 9 1 1 3 9 3 6 3 6 6 9 MergeSort 8 4 4 8 2 1 2 2 4 2 7 7 7 8 1 9 1 1 3 9 3 6 3 6 6 9 MergeSort 8 4 4 8 2 1 2 2 4 2 7 3 7 7 8 1 9 1 1 3 9 3 6 3 6 6 9 MergeSort-algoritmen 8 4 4 8 2 1 2 2 4 2 7 3 7 7 8 1 1 1 9 3 9 3 3 6 6 6 9 Exekveringstiden 7 5 9 7 3 6 9 0 0 2 3 5 2 0 2 3 4 5 6 0 2 3 4 5 6 4 4 Dela i två halvor 6 Sortera halvorna 7 9 Gör ”merge” till en temp array 7 9 Kopiera temp arrayen tillbaka till original arrayen Java implementation av Merge Sort public static void mergeSort( int [] a) { int [] temp= new int[a.length]; mergeSort(a, temp, 0, a.length-1); } private static void mergeSort( int [] a, int[] temp,int first,int last) { if(first<last){ int center=first+last/2; mergeSort(a,temp,first,center); mergeSort(a,temp,center+1,last) merge(a,temp,first,center+1,last); } } Se merge () i kurslitteraturen Quick Sort- algoritm <=pivot pivot >=pivot quickSort( a,first,last) { if(first<last) // välj pivot // dela arrayen // pivotindex= index av pivot quickSort(a,first,pivotindex-1) // sortera mindre quickSort(a,pivotindex+1,last) // sortera större } Vad påverkar ex.tiden? - Hur man väljer pivoten. Hur man gör indelningen. QuickSort() 8 1 4 9 Median av tre ->6 6 3 5 2 7 0 QuickSort() 8 1 4 9 0 3 5 2 7 6 QuickSort() 2 1 4 9 0 3 5 8 7 6 QuickSort() 2 1 4 5 0 3 9 8 7 6 QuickSort() 2 1 4 5 0 3 6 8 7 9 Vad påverkar ex.tiden - Hur man väljer pivoten Hur man gör indelningen