Una raccolta degli algoritmi in pseudo python (NB array partono da 1)
Ho cambiato nome alla variabili per rendere il codice più leggibile evitando di usare lettere che si assomigliano (p,q,b,d,i,j)
Tipo di algoritmo: incrementale
Input: A[1,...,n]
insertionSort(A[]) for i=2 to n # il primo elemento è già ordinato key = A[i] # numero da "ordinare" z = i-1 # A[1..i-1] ordinato, i-1 indice ultimo numero ordinato while z>0 and A[z]>key A[z+1] = A[z] # key è più piccolo quindi salvo A[z] in una posizione avanti z-- A[z+1] = key
Output: A[1,...,n] ordinato
Il while termina se:
z = 0
tutti gli elementi prima di i sono maggiori di key -> key va al primo posto A[1]
z > 0 AND A[z] <= key
A[z+1] = key
A[1. .i-1]
è ordinato e contiene gli elementi in (1,i-1)
inizialiA[1. .z]A[z+2. .i]
ordinato e A[z+2. .i] > key
i = n+1
;A[1. .n]
ordinato, come da invariante: vale A[1. .i-1]
ordinato, e i vale n+1
A[]
ordinato in modo inverso O(n2)A[]
ordinato O(n)Tipo di algoritmo: dividi et impera
A[i..n]
array di partenza con indice di scorrimento kInput: A[1,...,n],subAi,subAf
mergeSort(A[],subAi,subAf) if(subAi<subAf) # ci sono almeno 2 elementi? subH = (subAi+subAf)/2 # intero più piccolo mergeSort(A[],subAi,subH) mergeSort(A[],subH+1,subAf) merge(A[],subAi,subH,subAf)
Output: A[1,...,n] ordinato
subAf-subAi
)
subAf-subAi
== 0 or (-1) al più un elemento già ordinatosubAf-subAi
> 0 subH-subAi
,subAf-subH+1 < subAf-subAi
mergesort(A,subAi,sub)
mergesort(A,subH+1,subAf)
A[subAi..subAf]
ordinatoInput: A[subAi...subH...subAf]
merge(A[],subAi,subH,subAf) n1 = subH-subAi+1 # +1 perché contiamo da 1 n2 = subAf-subH for i=1 to n1 L[i] = A[subAi+i-1] for z=1 to n2 R[z] = A[subAi+z] L[n1+1] = R[n2+1] = "infinito" # molti elementi i = z = 1 for k=subAi to subAf if(L[i]<= R[z]) # se uguali prendo prima quello a sinistra A[k] = L[i] i++ else # se L[i] > R[z] A[k] = R[z] z++
Output: A[subAi,...,subAf] ordinato
A[subAi..subH]
A[subH+1..subAf]
Sottoarray A[subAi..k-1]
:
L[1..i-1]
e R[1..z-1]
L[i..n1]
e R[z..n2]
A[]
ordinato in modo inverso A[]
ordinato