Algorytmy 1
Sortowanie przez scalanie
Dany jest ciąg liczb $a_1, a_2, \ldots, a_n$. Posortuj te elementy za pomocą algorytmu sortowania przez scalanie (ang. merge sort), tzn. zastosuj poniższy algorytm (jest to wersja algorytmu sortowania przez scalanie z wartownikami):
\begin{algorithm} \caption{Sortowanie przez scalanie} \begin{algorithmic} \COMMENT{Cormen et al. \textit{Introduction to Algorithms}} \PROCEDURE{Merge}{$A, p, q, r$} \STATE $n1 \gets q-p+1$ \COMMENT{długość $A[p..q]$} \STATE $n2 \gets r-q$ \COMMENT{długość $A[q+1..r]$} \STATE \STATE create tables $L[0..n1], R[0..n2]$ \STATE \STATE \COMMENT{skopiuj $A[p..q]$ do $L[0..n1-1]$} \FOR{$i \gets 0$ \TO $n1-1$} \STATE $L[i] \gets A[p+i]$ \ENDFOR \STATE \STATE \COMMENT{skopiuj $A[q+1..r]$ do $R[0..n2-1]$} \FOR{$i \gets 0$ \TO $n2-1$} \STATE $R[i] \gets A[q+1+i]$ \ENDFOR \STATE \STATE \COMMENT{ustaw wartowników} \STATE $L[n1] \gets \text{SENTINEL}$ \STATE $R[n2] \gets \text{SENTINEL}$ \STATE \STATE $i \gets 0$ \COMMENT{$i$ indeksuje najmniejszy pozostały element w $L$} \STATE $j \gets 0$ \COMMENT{$j$ indeksuje najmniejszy pozostały element w $R$} \STATE \FOR{$k \gets p$ \TO $r$} \IF{$L[i] \le R[j]$} \COMMENT{Ile razy wykona się ta instrukcja?} \STATE $A[k] \gets L[i]$ \STATE $i \gets i+1$ \ELSE \STATE $A[k] \gets R[j]$ \STATE $j \gets j+1$ \ENDIF \ENDFOR \ENDPROCEDURE \STATE \PROCEDURE{Merge–Sort}{$A, p, r$} \IF{$p \ge r$} \COMMENT{zero lub jeden element} \RETURN \ENDIF \STATE $q \gets (p + r) / 2$ \COMMENT{środek A[p..r]} \STATE \CALL{Merge–Sort}{$A, p, q$} \COMMENT{posortuj rekurencyjnie A[p..q]} \STATE \CALL{Merge–Sort}{$A, q+1, r$} \COMMENT{posortuj rekurencyjnie A[q+1..r]} \STATE \CALL{Merge}{$A, p, q, r$} \COMMENT{scal A[p..q] i A[q+1..r] do A[p..r]} \ENDPROCEDURE \end{algorithmic} \end{algorithm}
Wejście
Pierwszy wiersz wejścia zawiera jedną liczbę $n$. Drugi wiersz zawiera $n$ liczb $a_i$.
Wyjście
Pierwszy wiersz wyjścia zawiara posortowany ciąg $n$ elementów $a_i$ w kolejności niemalejącej. W drugim wierszu wypisz ile razy wykona się test
L[i]<=R[j]
we funkcji Merge.
Ograniczenia
- $1 \le n \le 500 000$
- $-10^9 \le a_i \le 10^9$
Przykłady
Wejście 1
10
8 5 9 2 6 3 7 1 10 4
Wyjście 1
1 2 3 4 5 6 7 8 9 10
34