Questi sono i MERGE originale e unire fascicolazione algoritmi da Cormen, Leiserson, Rivest, Stein Introduzione agli algoritmi:
MERGE(A,p,q,r)
1 n1 = q - p + 1
2 n2 = r - q
3 let L[1..n1 + 1] and R[1..n2 + 1] be new arrays
4 for i = 1 to n1
5 L[i] = A[p + i - 1]
6 for j = 1 to n2
7 R[j] = A[q + j]
8 L[n1 + 1] = infinity
9 R[n2 + 1] = infinity
10 i = 1
11 j = 1
12 for k = p to r
13 if L[i] <= R[j]
14 A[k] = L[i]
15 i = i + 1
16 else A[k] = R[j]
17 j = j + 1
e
MERGE-SORT(A,p,r)
1 if p < r
2 q = floor((p + r)/2)
3 MERGE-SORT(A,p,q)
4 MERGE-SORT(A,q + 1,r)
5 MERGE(A,p,q,r)
alla linea 8 e 9 in MERGE all'infinito è la cosiddetta carta sentinella, che ha un valore tale che tutti gli elementi dell'array sono più piccoli di esso. Per ottenere il numero di inversione si può introdurre un contatore globale, diciamo ninv inizializzato a zero prima di chiamare MERGE-SORT e poi di modificare l'algoritmo MERGE aggiungendo una riga nella dichiarazione else dopo la riga 16, qualcosa come
ninv += n1 - i
che dopo MERGE-SORT è finito NINV conterrà il numero di inversioni
Molto simile: http://stackoverflow.com/questions/4552591/how-to-find-the-number-of- inversioni-in-un-array. La differenza è che questo specifica che la matrice contiene una permutazione, al contrario dei valori arbitrari. –
Correlati anche: [Conteggio delle inversioni in un array] (http://stackoverflow.com/questions/337664/counting-inversions-in-an-array) – PengOne