public static void insertionSort(int [] a)

Algoritmer och datastrukturer
Sorterings algoritmer
För utveckling av verksamhet, produkter och livskvalitet.
Varför är sortering viktigt ?
• Göra sökning effektivare, med syfte att effektivisera
hantering av stora datamängder.
- Binärsökning
•
! Förenklar vissa algoritmer
För utveckling av verksamhet, produkter och livskvalitet.
Varför är sortering viktigt ? En förenklad algoritm
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.
För utveckling av verksamhet, produkter och livskvalitet.
Kvadratiska O(n^2) sorteringar
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;
}
}
Ex.tiden O( ? )
Om arrayen är redan
sorterad?
Ex.tiden O( ? )
För utveckling av verksamhet, produkter och livskvalitet.
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;
}
}
insertionSort
8
4
2
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=4
8
4
2
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=4
8
8
2
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=4
8
8
2
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=4
4
8
2
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=2
4
8
2
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=2
4
8
8
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=2
4
8
8
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=2
4
4
8
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=2
4
4
8
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=2
2
4
8
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
2
4
8
7
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=7
2
4
8
8
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
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;
}
}
temp=7
2
4
7
8
1
För utveckling av verksamhet, produkter och livskvalitet.
9
3
5
6
insertionSort()- speciellt fall
1
2
3
4
5
6
7
8
Vad blir exekveringstiden när arrayen är sorterad?
Tidskomplexitet (värstafall): 1 + 2 + 3 + …. + n-1 = n(n-1)/2 = O(n^2)
För utveckling av verksamhet, produkter och livskvalitet.
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.
För utveckling av verksamhet, produkter och livskvalitet.
Divade & Conquer - strategi
 Att dela ett problem i två mindre subproblem
rekursivt repeterade gånger ( tills det inte går att
dela mer)
 Att sätta ihop lösningen till subproblemen till man
sätter ihop original problemet.
För utveckling av verksamhet, produkter och livskvalitet.
MergeSort -algoritmen
8
4
8
4
8
4
8
2
2
1
9
7
2
4
7
2
3
1
7
1
7
9
9
1
För utveckling av verksamhet, produkter och livskvalitet.
9
6
3
6
3
6
3
6
MergeSort
8
4
4
8
2
4
2
2
7
7
7
8
1
9
1
1
3
9
3
1
För utveckling av verksamhet, produkter och livskvalitet.
6
3
6
6
9
MergeSort
8
4
4
8
2
1
2
2
4
7
7
7
8
1
9
1
1
3
9
3
2
För utveckling av verksamhet, produkter och livskvalitet.
6
3
6
6
9
MergeSort
8
4
4
8
2
1
2
2
4
7
7
7
8
1
9
1
1
3
9
3
2
För utveckling av verksamhet, produkter och livskvalitet.
6
3
6
6
9
MergeSort-algoritmen
8
4
4
8
2
1
2
2
4
2
7
7
7
8
1
1
1
9
3
9
3
3
3
För utveckling av verksamhet, produkter och livskvalitet.
6
6
6
9
Tidskomplexiteten?
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
För utveckling av verksamhet, produkter och livskvalitet.
Kopiera temp arrayen tillbaka
till original arrayen
Java implementation av MergeSort()
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);
}
}
För utveckling av verksamhet, produkter och livskvalitet.
Quicksort
•
•
•
•
•
Divide and conquer algoritm med flera variationer
Bättre i medelfall än övriga algoritmer
Dålig i värsta fall, som dock kan händer nästan aldrig
Idé: Välj ut ett element (pivot) och se till att det hamnar på
rätt plats genom att först flytta om övriga element så att alla
som är mindre än pivotelementet hamnar till vänster och alla
större hamnar till höger.
Upprepa sedan (rekursivt) på vänster och höger delar av
arrayen
För utveckling av verksamhet, produkter och livskvalitet.
QuickSort- implementationsskiss
<=pivot
pivot
>=pivot
quickSort( a, first, last)
{
if(first<last)
// välj pivot
// dela arrayen
quickSort(a,first,pivotindex-1) // sortera mindre
quickSort(a,pivotindex+1,last) // sortera större
}
För utveckling av verksamhet, produkter och livskvalitet.
Quicksort med pivot == median av tre
Antag vi skall sortera array a[low] ..a[high].
Mittplatsen mid = (low + high) / 2.
Utred storleksordningen mellan elementen a[low], a[high] och a[mid].
Byt samtidigt platser så att platsen low kommer att innehålla det minsta av dem,
mid det mittersta i storleksordning och high det största.
low mid
high
8149635270
low
mid
high
0149635278
Pivotelementet = medianen av de tre
För utveckling av verksamhet, produkter och livskvalitet.
QuickSort()
8
1
4
9
6
3
5
2
Median av tre ->6
För utveckling av verksamhet, produkter och livskvalitet.
7
0
QuickSort()
8
1
4
9
0
3
5
2
För utveckling av verksamhet, produkter och livskvalitet.
7
6
QuickSort()
2
1
4
9
0
3
5
8
För utveckling av verksamhet, produkter och livskvalitet.
7
6
QuickSort()
2
1
4
5
0
3
9
8
För utveckling av verksamhet, produkter och livskvalitet.
7
6
QuickSort()
2
1
4
5
0
3
6
8
För utveckling av verksamhet, produkter och livskvalitet.
7
9
Tidskomplexiteten
1)Bästa fall (man kan bevisa) : Delar vektorn i lika stora delar i
varje pass.
Rekursionsformeln blir T(n) = 2T(n/2) + n vilket ger T(n) n*log
n.
2)Sämsta fall: Vektorn delas alltid i en tom del och en del som
består av alla element utom pivot. Rekursionsformel: W(n) =
W(n-1) + n ==> W(n) = n(n-1)/2 = O(n2)
För utveckling av verksamhet, produkter och livskvalitet.
Priority Queues and Heap
Binär heap och prioritest köer
För utveckling av verksamhet, produkter och livskvalitet.
Köer med prioritet, varför?
•
Ett behov av olika prioritesnivåer.
• Skrivare-kö
• 1-sida skrivs ut/ 100-sidor skrivs ut
• TCP/IP Stack
• ”Fast-lane”, (RT ) för mycket viktig trafik
• Real-tid system
• Schemaläggning av processer
För utveckling av verksamhet, produkter och livskvalitet.
Prioritets tilldellning
• Varje uppgift / objekt i kö innehåller också ett
prioritet-nummer
• Vanligtviss positiva heltal
• Där största värde har minsta prioritet
För utveckling av verksamhet, produkter och livskvalitet.
Mer om priority queues…
•
Viktiga operationer
• Lägg till, nya objekt
• … med tilldelning av prioritet
• insert()
• Hitta, objektet med högst prioritet
• … den mista prioritet-nummer
• findMin()
• Ta bort, objektet med högst prioritet
• deleteMin()
(put, get, remove) or (enqueue, peek, dequeue)
För utveckling av verksamhet, produkter och livskvalitet.
Passande datastruktur?
•
•
Snaba insert
• Helst konstant tid !
Snabba remove och sökning
• Helst konstant tid !
För utveckling av verksamhet, produkter och livskvalitet.
Ordnad länkad-lista
•
•
insert()
• konstant tid!
findMin()
• Linjär tid…
3
2
4
H
T
För utveckling av verksamhet, produkter och livskvalitet.
Sorterad länkad-lista
•
•
insert()
• Linjär tid…
findMin()
• Konstant tid!
2
4
H
3
T
För utveckling av verksamhet, produkter och livskvalitet.
Binära träd
•
•
insert()
• log N
findMin()
• log N
För utveckling av verksamhet, produkter och livskvalitet.
Binära Träd
•
•
insert()
• log N
findMin()/ findMax()
• log N
För utveckling av verksamhet, produkter och livskvalitet.
Balancerade binära träd
•
•
insert()
• log N
findMin()
• log N
Kräver ”hårt” arbete för
balancering
För utveckling av verksamhet, produkter och livskvalitet.
Kompromiss – Binary Heap
•
Kombination mellan träd och array
• Strukturell egenskap
• Order egenskap , heap order
För utveckling av verksamhet, produkter och livskvalitet.
Strukturell egenskap
•
Implicit representation
• Representeras som ett komplett binär träd med array
• För ett objekt på array-position x:
• Left child på array-position 2x
• Rigth child på array-position 2x + 1
• Parent at array-position x/2
Root
0 1 2 3 4 5 6 7 8
För utveckling av verksamhet, produkter och livskvalitet.
Order egenskap
•
Heap-order
• För ett objekt X som har parent P gäller:
• X’s priority key has to be greater than P’s priority key
• Objektet med den minsta prioritets- nummer ( högst
prioritet) finns alltid i rooten. Kallas MIN HEAP
• Konstant tid for findMin()!
• Omvända alternativ finns okcså MAXHEAP
• Konstant tid for findMAX()!
För utveckling av verksamhet, produkter och livskvalitet.
Exempel – insert()
13
21
16
24
65
31
26
32
19
68
14
Percolate up/ swim
För utveckling av verksamhet, produkter och livskvalitet.
Exempel – Remove()
13
14
16
24
65
21
26
32
19
68
31
Percolate down/ sink
För utveckling av verksamhet, produkter och livskvalitet.
… Hur bra är den?
•
•
insert()
• log N – värsta fall
• Konstant tid – medel fall
deleteMin()
• log N – värsta fall och i medel fall
För utveckling av verksamhet, produkter och livskvalitet.
Prioritets kö för sortering – Heapsort
•
•
Använder a max heap
Heapsort
1. (Strukturerar data )
2. Bygger heap
3. Använder deleteMax för att ta bort data O(N log N)
(worst-case)
För utveckling av verksamhet, produkter och livskvalitet.
Heapsort – Steg 1
•
•
Kopierara data till en max heap struktur
Behövs inte om data redan är i array
?
För utveckling av verksamhet, produkter och livskvalitet.
Heapsort – Steg 2
•
•
•
Bygger heap
Perculate down frrån alla föräldrar
Börjar med sista
2
4
5
6
1
7
För utveckling av verksamhet, produkter och livskvalitet.
3
Heapsort – Steg 3
•
Sortera med deleteMax
7
5
4
6
1
2
För utveckling av verksamhet, produkter och livskvalitet.
3
Heapsort – Step 3
•
Sort with deleteMax
7
5
4
6
1
2
För utveckling av verksamhet, produkter och livskvalitet.
3
Heapsort – Steg 3
•
Sortera med deleteMax
6
5
4
3
1
2
För utveckling av verksamhet, produkter och livskvalitet.
7
Heapsort – Steg 3
•
Sortera med deleteMax
5
4
2
3
1
6
För utveckling av verksamhet, produkter och livskvalitet.
7
Heapsort – Steg 3
•
Sortera med deleteMax
4
2
1
3
5
6
För utveckling av verksamhet, produkter och livskvalitet.
7
Heapsort – Steg 3
•
Sortera with deleteMax
3
2
4
1
5
6
För utveckling av verksamhet, produkter och livskvalitet.
7
Heapsort – Steg 3
•
Sortera med deleteMax
2
1
4
3
5
6
För utveckling av verksamhet, produkter och livskvalitet.
7
Slutsats
•
•
Priority Queues
• Unsorted linked-list
• Sorted linked-list
• Binary trees
• Binary heap
Heap sort
• Fast! (O(N log N) worst-case)
För utveckling av verksamhet, produkter och livskvalitet.