SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
Complessità e Ordinamento
Ezio Sperduto
Notazioni Asintotiche
grandi O(…) Ω(…) Θ(…)
piccole o(…) ω(…)piccole o(…) ω(…)
definiscono ordini di grandezza delle funzioni
Notazioni Asintotiche
parametro n: dimensione dell’input
T(n)=O(n2)T(n)=O(n2)
Complessità temporale Classe delle funzioni
quadratiche
Notazioni Asintotiche
Formalmente:
f(n) ∈ O(g(n))∈
O(g(n)) =
{h(n): ∃x0, c t.c. ∀n≥x0 ⇒ 0 ≤ h(n) ≤ c·g(n)}
Notazioni Asintotiche
(a) f(n) è stretta tra c1·g(n) e c2·g(n) Θ(g(n))
(b) f(n) è spinta sotto la funzione c·g(n) O(g(n))
(c) f(n) è spinta sopra la funzione c·g(n) Ω(g(n))
Notazioni Asintotiche
Θ(n)
Θ(n log n)
Θ(n2)
Θ(log n)
Gli ordini di grandezza identificano delle
CLASSI di COMPLESSITA’
Scrivere T(n)=O(log n) equivale a scrivere “correttamente” T(n) ∈ O(log n)
Notazioni Asintotiche
Notazioni grandi e notazioni piccole:
f(n)=O(g(n)) f(n) ≤ classe di g(n)
la notazione O-grande indica un limite superiore non strettola notazione O-grande indica un limite superiore non stretto
f(n)=o(g(n)) f(n) < classe di g(n)
la notazione O-piccola indica un limite superiore stretto
Complessità Temporale
Classi di complessità asintotica più note:
O(1) costante
O(logn) logaritmico
O(n) lineare
O(nlogn) log-lineareO(nlogn) log-lineare
O(n2) quadratico
O(n3) cubico
O(n4) ….. polinomiali superiori
O(cn) esponenziale
O(n!) super-esponenziale
…
Ordinamento
Input: a1, a2,…,an
sequenza di valori (interi) non-ordinata
Output: a’1, a’2,…,a’n
permutazione ordinata dei valori in input
Ordinamento
La tecnica di ordinamento varia in base agli
elementi da ordinare:
- valori
- strutture/oggetti con attributo discriminante- strutture/oggetti con attributo discriminante
La tecnica di ordinamento varia in base alla
struttura contenitore:
- array / blocco di memoria ad accesso costante
- lista collegata di elementi
HeapSort
Basato su struttura Heap: albero binario con 2 proprietà
- Heap property: un nodo contiene un valore
maggiore dei sottoalberimaggiore dei sottoalberi
- shape property: albero completo tranne
ultimo livello
altezza dell’albero O(logn)
HeapSort
Heap property
HeapSort
Implementazione mediante vettore, per livelli:
left(i) = 2*i
right(i) = 2*i + 1
HeapSort
Operazione Heapify:
- input: nodo v dell’heap
(assunto: i sottoalberi sono heap)
- output: il sottoalbero su v è un heap
(il valore di v potrà essere scambiato con i valori
nei sottoalberi)
HeapSort
void heapify(int[] h, int i){
int sx=left(i);
int dx=right(i);
int m=indMax(h, sx, dx, i);
complessità:
O(logn)
applicato alla radice
int m=indMax(h, sx, dx, i);
if(i != m){
swapValue(h,i,m);
heapify(h,m)
}
}
HeapSort
void buildHeap(int[] h){
for(int i=h.length/2; i>=0; i--)
heapify(h,i);
}
complessità:
O(n)
analisi ammortizzata
}
Applico heapify a tutti i nodi con figli dell’heap.
Partendo dall’ultimo, fino al primo.
HeapSort
void heapSort(int[] h){
buildheap(h); O(n)
for(int i=h.length-1; i<=1;i--){ O(n)for(int i=h.length-1; i<=1;i--){ O(n)
swapValue(h,0,i); O(1)
heapify(h,0,i-1); O(logn)
}
}
Il terzo parametro nell’heapify diminuisce la dimensione.
Complessità: O(nlogn)
HeapSort
Caso peggiore: O(nlogn)
Caso migliore: O(nlogn)
Caso medio: O(nlogn)
Complessità spaziale: O(1)
Stabile: no
In place: si
QuickSort
void quickSort(int[] a, int n1, int n2){
if(n1<n2){
p=partition(a,n1,n2);
quickSort(a,n1,p);
quickSort(a,p+1,n2);
}
}
QuickSort
Metodo partition (versione di Hoare):
int partition(int[] a, int n1, int n2){
int x=a[n1];
int i=n1-1;
int j=n2+1;
while(true){
vettore a
Pivot
valori ≤
valori ≥
i j
while(true){
do j--; while(!(a[j]<=x));
do i++; while(!(a[i]>=x));
if(i<j)
swap(A,i,j);
else
return j;
}
}
QuickSort
Caso peggiore: O(n2)
Caso migliore: O(nlogn)
Caso medio: O(nlogn)
Complessità spaziale: O(logn)
Stabile: no
In place: si
Ordinamento
Algoritmo Peggiore Medio Migliore Memoria Stabile In Place
CountingSort O(n+k) O(n+k) O(n+k) O(n+k) SI NO
HeapSort O(nlogn) O(nlogn) O(nlogn) O(1) NO SI
QuickSort(2) O(nlogn) O(nlogn) O(nlogn) O(nlogn) NO SI
MergeSort O(nlogn) O(nlogn) O(nlogn) O(n) SI NO
SelectionSort O(n2) O(n2) O(n2) O(1) NO SISelectionSort O(n ) O(n ) O(n ) O(1) NO SI
InsertionSort O(n2) O(n2) O(n) O(1) SI SI
BubbleSort O(n2) O(n2) O(n) O(1) SI SI
QuickSort(1) O(n2) O(nlogn) O(nlogn) O(nlogn) NO SI
StupidSort Illimitato O(n*n!) O(n) O(n) NO SI
Ordinamento
java.util.Arrays.sort(…)
The sorting algorithm is a Dual-Pivot Quicksort by
Vladimir Yaroslavskiy, Jon Bentley, and JoshuaVladimir Yaroslavskiy, Jon Bentley, and Joshua
Bloch. This algorithm offers O(n log(n))
performance on many data sets that cause other
quicksorts to degrade to quadratic performance,
and is typically faster than traditional (one-pivot)
Quicksort implementations.
Ordinamento
OpenJDK: java.util.Arrays.sort(…)
private static void sort1(int x[], int off, int len) {
// Insertion sort on smallest arrays
if (len < 7) {
… }
// Choose a partition element, v
…
// Establish Invariant: v* (<v)* (>v)* v*
…
// Swap partition elements back to middle
…
// Recursively sort non-partition-elements
…
}
Ordinamento
java.util.Collections.sort(…)
• Implementation note: This implementation is a stable, adaptive, iterative mergesort that
requires far fewer than n lg(n) comparisons when the input array is partially sorted, while
offering the performance of a traditional mergesort when the input array is randomly
ordered. If the input array is nearly sorted, the implementation requires approximately n
comparisons. Temporary storage requirements vary from a small constant for nearly sorted
input arrays to n/2 object references for randomly ordered input arrays.
• The implementation takes equal advantage of ascending and descending order in its input• The implementation takes equal advantage of ascending and descending order in its input
array, and can take advantage of ascending and descending order in different parts of the
same input array. It is well-suited to merging two or more sorted arrays: simply concatenate
the arrays and sort the resulting array.
• The implementation was adapted from Tim Peters's list sort for Python (TimSort). It uses
techiques from Peter McIlroy's "Optimistic Sorting and Information Theoretic Complexity", in
Proceedings of the Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-
474, January 1993.
• This implementation dumps the specified list into an array, sorts the array, and iterates over
the list resetting each element from the corresponding position in the array. This avoids the
n2 log(n) performance that would result from attempting to sort a linked list in place.

Weitere ähnliche Inhalte

Was ist angesagt?

Calcolo Infinitesimale
Calcolo InfinitesimaleCalcolo Infinitesimale
Calcolo Infinitesimaleguesta43993
 
Lezione 12 (28 marzo 2012) puntatori vettori
Lezione 12 (28 marzo 2012) puntatori   vettoriLezione 12 (28 marzo 2012) puntatori   vettori
Lezione 12 (28 marzo 2012) puntatori vettoriSTELITANO
 
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni   memoria - puntatoriLezione 12 (28 marzo 2012) funzioni   memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni memoria - puntatoriSTELITANO
 
Algoritmi e Calcolo Parallelo 2012/2013 - Analisi degli Algoritmi
Algoritmi e Calcolo Parallelo 2012/2013 - Analisi degli AlgoritmiAlgoritmi e Calcolo Parallelo 2012/2013 - Analisi degli Algoritmi
Algoritmi e Calcolo Parallelo 2012/2013 - Analisi degli AlgoritmiPier Luca Lanzi
 
Parallel Sparse Matrix Vector Multiplication Using CSB
Parallel Sparse Matrix Vector Multiplication Using CSBParallel Sparse Matrix Vector Multiplication Using CSB
Parallel Sparse Matrix Vector Multiplication Using CSBDavid Santucci
 
Processo di Ornstein Uhlenbeck
Processo di Ornstein UhlenbeckProcesso di Ornstein Uhlenbeck
Processo di Ornstein UhlenbeckGiuseppe Torrisi
 
Algoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, codeAlgoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, codeSergio Porcu
 
La crittografia frattale in Perl
La crittografia frattale in PerlLa crittografia frattale in Perl
La crittografia frattale in PerlMario Rossano
 
Strutture dati 04-funzionicustom-classioggetti
Strutture dati 04-funzionicustom-classioggettiStrutture dati 04-funzionicustom-classioggetti
Strutture dati 04-funzionicustom-classioggettiStudiabo
 
Appunti sugli-integrali-definiti
Appunti sugli-integrali-definitiAppunti sugli-integrali-definiti
Appunti sugli-integrali-definitimvivabr
 
Infinitesimi ed infiniti [teoria ed esericizi][santi caltabiano]
Infinitesimi ed infiniti [teoria ed esericizi][santi caltabiano]Infinitesimi ed infiniti [teoria ed esericizi][santi caltabiano]
Infinitesimi ed infiniti [teoria ed esericizi][santi caltabiano]santi caltabiano
 

Was ist angesagt? (16)

Java Lezione 1
Java Lezione 1Java Lezione 1
Java Lezione 1
 
DHow2 - L1
DHow2 - L1DHow2 - L1
DHow2 - L1
 
Calcolo Infinitesimale
Calcolo InfinitesimaleCalcolo Infinitesimale
Calcolo Infinitesimale
 
Lezione 12 (28 marzo 2012) puntatori vettori
Lezione 12 (28 marzo 2012) puntatori   vettoriLezione 12 (28 marzo 2012) puntatori   vettori
Lezione 12 (28 marzo 2012) puntatori vettori
 
Ese01 java
Ese01 javaEse01 java
Ese01 java
 
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni   memoria - puntatoriLezione 12 (28 marzo 2012) funzioni   memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
 
Array in C++
Array in C++Array in C++
Array in C++
 
Algoritmi e Calcolo Parallelo 2012/2013 - Analisi degli Algoritmi
Algoritmi e Calcolo Parallelo 2012/2013 - Analisi degli AlgoritmiAlgoritmi e Calcolo Parallelo 2012/2013 - Analisi degli Algoritmi
Algoritmi e Calcolo Parallelo 2012/2013 - Analisi degli Algoritmi
 
Alberi di derivazione
Alberi di derivazioneAlberi di derivazione
Alberi di derivazione
 
Parallel Sparse Matrix Vector Multiplication Using CSB
Parallel Sparse Matrix Vector Multiplication Using CSBParallel Sparse Matrix Vector Multiplication Using CSB
Parallel Sparse Matrix Vector Multiplication Using CSB
 
Processo di Ornstein Uhlenbeck
Processo di Ornstein UhlenbeckProcesso di Ornstein Uhlenbeck
Processo di Ornstein Uhlenbeck
 
Algoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, codeAlgoritmi e Programmazione Avanzata - Liste, pile, code
Algoritmi e Programmazione Avanzata - Liste, pile, code
 
La crittografia frattale in Perl
La crittografia frattale in PerlLa crittografia frattale in Perl
La crittografia frattale in Perl
 
Strutture dati 04-funzionicustom-classioggetti
Strutture dati 04-funzionicustom-classioggettiStrutture dati 04-funzionicustom-classioggetti
Strutture dati 04-funzionicustom-classioggetti
 
Appunti sugli-integrali-definiti
Appunti sugli-integrali-definitiAppunti sugli-integrali-definiti
Appunti sugli-integrali-definiti
 
Infinitesimi ed infiniti [teoria ed esericizi][santi caltabiano]
Infinitesimi ed infiniti [teoria ed esericizi][santi caltabiano]Infinitesimi ed infiniti [teoria ed esericizi][santi caltabiano]
Infinitesimi ed infiniti [teoria ed esericizi][santi caltabiano]
 

Ähnlich wie Complessità e ordinamento di Ezio Sperduto

Ähnlich wie Complessità e ordinamento di Ezio Sperduto (20)

Massimi e minimi
Massimi e minimiMassimi e minimi
Massimi e minimi
 
Esercitazione 4 (19 marzo 2012)
Esercitazione 4 (19 marzo 2012)Esercitazione 4 (19 marzo 2012)
Esercitazione 4 (19 marzo 2012)
 
Selection sort
Selection sortSelection sort
Selection sort
 
Schema Risolutivo Delle Serie
Schema Risolutivo Delle SerieSchema Risolutivo Delle Serie
Schema Risolutivo Delle Serie
 
Java lezione 7
Java lezione 7Java lezione 7
Java lezione 7
 
Complessita' computazionale
Complessita' computazionaleComplessita' computazionale
Complessita' computazionale
 
R Vectors
R VectorsR Vectors
R Vectors
 
Array
ArrayArray
Array
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Eserc v del 26 marzo 2012
 Eserc v del 26 marzo 2012 Eserc v del 26 marzo 2012
Eserc v del 26 marzo 2012
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMs
 
08 mapreduce
08   mapreduce08   mapreduce
08 mapreduce
 
Spyppolare o non spyppolare
Spyppolare o non spyppolareSpyppolare o non spyppolare
Spyppolare o non spyppolare
 
Flessi
FlessiFlessi
Flessi
 
Umano vs Computer: un esempio pratico
Umano vs Computer: un esempio praticoUmano vs Computer: un esempio pratico
Umano vs Computer: un esempio pratico
 
07 2 ricorsione
07 2 ricorsione07 2 ricorsione
07 2 ricorsione
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
Algoritmi di ordinamento
Algoritmi di ordinamentoAlgoritmi di ordinamento
Algoritmi di ordinamento
 
Insertion sort
Insertion sortInsertion sort
Insertion sort
 

Mehr von Vitalij Zadneprovskij

Java 8: le nuove-interfacce di Ezio Sperduto
Java 8: le nuove-interfacce di Ezio SperdutoJava 8: le nuove-interfacce di Ezio Sperduto
Java 8: le nuove-interfacce di Ezio SperdutoVitalij Zadneprovskij
 
Iced tea, la macchina virtuale Java libera
Iced tea, la macchina virtuale Java liberaIced tea, la macchina virtuale Java libera
Iced tea, la macchina virtuale Java liberaVitalij Zadneprovskij
 
Java 8: Nashorn & avatar.js di Enrico Risa al JUG Roma
Java 8: Nashorn & avatar.js di Enrico Risa al JUG RomaJava 8: Nashorn & avatar.js di Enrico Risa al JUG Roma
Java 8: Nashorn & avatar.js di Enrico Risa al JUG RomaVitalij Zadneprovskij
 
Protocolli di comunicazione tra moduli e SOA
Protocolli di comunicazione tra moduli e SOAProtocolli di comunicazione tra moduli e SOA
Protocolli di comunicazione tra moduli e SOAVitalij Zadneprovskij
 

Mehr von Vitalij Zadneprovskij (7)

Metodi asincroni in spring
Metodi asincroni in springMetodi asincroni in spring
Metodi asincroni in spring
 
Java 8: le nuove-interfacce di Ezio Sperduto
Java 8: le nuove-interfacce di Ezio SperdutoJava 8: le nuove-interfacce di Ezio Sperduto
Java 8: le nuove-interfacce di Ezio Sperduto
 
Iced tea, la macchina virtuale Java libera
Iced tea, la macchina virtuale Java liberaIced tea, la macchina virtuale Java libera
Iced tea, la macchina virtuale Java libera
 
Java 8: Nashorn & avatar.js di Enrico Risa al JUG Roma
Java 8: Nashorn & avatar.js di Enrico Risa al JUG RomaJava 8: Nashorn & avatar.js di Enrico Risa al JUG Roma
Java 8: Nashorn & avatar.js di Enrico Risa al JUG Roma
 
Continous integration e jenkins
Continous integration e jenkinsContinous integration e jenkins
Continous integration e jenkins
 
Protocolli di comunicazione tra moduli e SOA
Protocolli di comunicazione tra moduli e SOAProtocolli di comunicazione tra moduli e SOA
Protocolli di comunicazione tra moduli e SOA
 
Appunti di teoria dell informazione
Appunti di teoria dell informazioneAppunti di teoria dell informazione
Appunti di teoria dell informazione
 

Complessità e ordinamento di Ezio Sperduto

  • 2. Notazioni Asintotiche grandi O(…) Ω(…) Θ(…) piccole o(…) ω(…)piccole o(…) ω(…) definiscono ordini di grandezza delle funzioni
  • 3. Notazioni Asintotiche parametro n: dimensione dell’input T(n)=O(n2)T(n)=O(n2) Complessità temporale Classe delle funzioni quadratiche
  • 4. Notazioni Asintotiche Formalmente: f(n) ∈ O(g(n))∈ O(g(n)) = {h(n): ∃x0, c t.c. ∀n≥x0 ⇒ 0 ≤ h(n) ≤ c·g(n)}
  • 5. Notazioni Asintotiche (a) f(n) è stretta tra c1·g(n) e c2·g(n) Θ(g(n)) (b) f(n) è spinta sotto la funzione c·g(n) O(g(n)) (c) f(n) è spinta sopra la funzione c·g(n) Ω(g(n))
  • 6. Notazioni Asintotiche Θ(n) Θ(n log n) Θ(n2) Θ(log n) Gli ordini di grandezza identificano delle CLASSI di COMPLESSITA’ Scrivere T(n)=O(log n) equivale a scrivere “correttamente” T(n) ∈ O(log n)
  • 7. Notazioni Asintotiche Notazioni grandi e notazioni piccole: f(n)=O(g(n)) f(n) ≤ classe di g(n) la notazione O-grande indica un limite superiore non strettola notazione O-grande indica un limite superiore non stretto f(n)=o(g(n)) f(n) < classe di g(n) la notazione O-piccola indica un limite superiore stretto
  • 8. Complessità Temporale Classi di complessità asintotica più note: O(1) costante O(logn) logaritmico O(n) lineare O(nlogn) log-lineareO(nlogn) log-lineare O(n2) quadratico O(n3) cubico O(n4) ….. polinomiali superiori O(cn) esponenziale O(n!) super-esponenziale …
  • 9. Ordinamento Input: a1, a2,…,an sequenza di valori (interi) non-ordinata Output: a’1, a’2,…,a’n permutazione ordinata dei valori in input
  • 10. Ordinamento La tecnica di ordinamento varia in base agli elementi da ordinare: - valori - strutture/oggetti con attributo discriminante- strutture/oggetti con attributo discriminante La tecnica di ordinamento varia in base alla struttura contenitore: - array / blocco di memoria ad accesso costante - lista collegata di elementi
  • 11. HeapSort Basato su struttura Heap: albero binario con 2 proprietà - Heap property: un nodo contiene un valore maggiore dei sottoalberimaggiore dei sottoalberi - shape property: albero completo tranne ultimo livello altezza dell’albero O(logn)
  • 13. HeapSort Implementazione mediante vettore, per livelli: left(i) = 2*i right(i) = 2*i + 1
  • 14. HeapSort Operazione Heapify: - input: nodo v dell’heap (assunto: i sottoalberi sono heap) - output: il sottoalbero su v è un heap (il valore di v potrà essere scambiato con i valori nei sottoalberi)
  • 15. HeapSort void heapify(int[] h, int i){ int sx=left(i); int dx=right(i); int m=indMax(h, sx, dx, i); complessità: O(logn) applicato alla radice int m=indMax(h, sx, dx, i); if(i != m){ swapValue(h,i,m); heapify(h,m) } }
  • 16. HeapSort void buildHeap(int[] h){ for(int i=h.length/2; i>=0; i--) heapify(h,i); } complessità: O(n) analisi ammortizzata } Applico heapify a tutti i nodi con figli dell’heap. Partendo dall’ultimo, fino al primo.
  • 17. HeapSort void heapSort(int[] h){ buildheap(h); O(n) for(int i=h.length-1; i<=1;i--){ O(n)for(int i=h.length-1; i<=1;i--){ O(n) swapValue(h,0,i); O(1) heapify(h,0,i-1); O(logn) } } Il terzo parametro nell’heapify diminuisce la dimensione. Complessità: O(nlogn)
  • 18. HeapSort Caso peggiore: O(nlogn) Caso migliore: O(nlogn) Caso medio: O(nlogn) Complessità spaziale: O(1) Stabile: no In place: si
  • 19. QuickSort void quickSort(int[] a, int n1, int n2){ if(n1<n2){ p=partition(a,n1,n2); quickSort(a,n1,p); quickSort(a,p+1,n2); } }
  • 20. QuickSort Metodo partition (versione di Hoare): int partition(int[] a, int n1, int n2){ int x=a[n1]; int i=n1-1; int j=n2+1; while(true){ vettore a Pivot valori ≤ valori ≥ i j while(true){ do j--; while(!(a[j]<=x)); do i++; while(!(a[i]>=x)); if(i<j) swap(A,i,j); else return j; } }
  • 21. QuickSort Caso peggiore: O(n2) Caso migliore: O(nlogn) Caso medio: O(nlogn) Complessità spaziale: O(logn) Stabile: no In place: si
  • 22. Ordinamento Algoritmo Peggiore Medio Migliore Memoria Stabile In Place CountingSort O(n+k) O(n+k) O(n+k) O(n+k) SI NO HeapSort O(nlogn) O(nlogn) O(nlogn) O(1) NO SI QuickSort(2) O(nlogn) O(nlogn) O(nlogn) O(nlogn) NO SI MergeSort O(nlogn) O(nlogn) O(nlogn) O(n) SI NO SelectionSort O(n2) O(n2) O(n2) O(1) NO SISelectionSort O(n ) O(n ) O(n ) O(1) NO SI InsertionSort O(n2) O(n2) O(n) O(1) SI SI BubbleSort O(n2) O(n2) O(n) O(1) SI SI QuickSort(1) O(n2) O(nlogn) O(nlogn) O(nlogn) NO SI StupidSort Illimitato O(n*n!) O(n) O(n) NO SI
  • 23. Ordinamento java.util.Arrays.sort(…) The sorting algorithm is a Dual-Pivot Quicksort by Vladimir Yaroslavskiy, Jon Bentley, and JoshuaVladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm offers O(n log(n)) performance on many data sets that cause other quicksorts to degrade to quadratic performance, and is typically faster than traditional (one-pivot) Quicksort implementations.
  • 24. Ordinamento OpenJDK: java.util.Arrays.sort(…) private static void sort1(int x[], int off, int len) { // Insertion sort on smallest arrays if (len < 7) { … } // Choose a partition element, v … // Establish Invariant: v* (<v)* (>v)* v* … // Swap partition elements back to middle … // Recursively sort non-partition-elements … }
  • 25. Ordinamento java.util.Collections.sort(…) • Implementation note: This implementation is a stable, adaptive, iterative mergesort that requires far fewer than n lg(n) comparisons when the input array is partially sorted, while offering the performance of a traditional mergesort when the input array is randomly ordered. If the input array is nearly sorted, the implementation requires approximately n comparisons. Temporary storage requirements vary from a small constant for nearly sorted input arrays to n/2 object references for randomly ordered input arrays. • The implementation takes equal advantage of ascending and descending order in its input• The implementation takes equal advantage of ascending and descending order in its input array, and can take advantage of ascending and descending order in different parts of the same input array. It is well-suited to merging two or more sorted arrays: simply concatenate the arrays and sort the resulting array. • The implementation was adapted from Tim Peters's list sort for Python (TimSort). It uses techiques from Peter McIlroy's "Optimistic Sorting and Information Theoretic Complexity", in Proceedings of the Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467- 474, January 1993. • This implementation dumps the specified list into an array, sorts the array, and iterates over the list resetting each element from the corresponding position in the array. This avoids the n2 log(n) performance that would result from attempting to sort a linked list in place.