void mergeSort(long first, long last) { if(first < last) { long mid = (first + last) / 2; mergeSort(first, mid); mergeSort(mid+1, last); merge(first, mid, last); } } void merge(long p, long q, long r) { long i, j = 0; long beginA = p, endA = q, beginB = q+1, endB = r; while(beginA <= endA && beginB <= endB) { if(a[beginA] <= a[beginB]) { b[j++] = a[beginA++]; } else { b[j++] = a[beginB++]; change += q - beginA + 1; } } while(beginA <= endA) { b[j++] = a[beginA++]; } while(beginB <= endB) { b[j++] = a[beginB++]; } for(i = 0; i < j; i++) { a[p+i] = b[i]; } } |