Question link: http://poj.org/problem? Id = 2299
Calculate the minimum number of exchanges in the sorting process
This problem is solved using the merge sort grouping algorithm.
Code:
# Include <iostream> # include <cstdio> # include <cstring> # define n 500001 using namespace STD; int A [n]; int temp [N]; long ans; void Merge (int * a, int start, int mid, int end, int * temp) {int AI = start; int Bi = Mid + 1; int K = 0; while (AI <= Mid & BI <= END) {if (a [ai] <= A [bi]) temp [k ++] = A [ai ++]; else {temp [k ++] = A [bi ++]; ans + = (mid-ai + 1) ;}while (AI <= mid) temp [k ++] = A [ai ++]; while (Bi <= END) temp [k ++] = A [bi ++]; for (INT I = 0; I <= end-start; I ++) {A [start + I] = temp [I] ;}} void merge_array (int * a, int start, int end) {If (start <End) {int mid = (start + end)/2; merge_array (A, start, mid); merge_array (A, Mid + 1, end); merge (A, start, mid, end, temp) ;}int main () {int N; scanf ("% d", & N); While (n) {memset (A, 0, sizeof (a); ans = 0; For (INT I = 0; I <n; I ++) scanf ("% d", & A [I]); merge_array (A, 0, n-1); printf ("% i64d \ n", ANS); scanf ("% d", & N);} return 0 ;}