Merge Sort: Counting Inversions
这道题设定了一个情景,但其实是让我们复习merge sort。那么我们就来复习一下merge sort。
Merge sort的思想是先把数组分段,递归进行mergesort,再合并起来。有一个细节,在合并的过程中,可以借助合并的两段都是sort好的数列,利用这一特性合并起来会较快一些。送上伪代码:
MergeSort(arr[], l, r)
If r > l
1. Find the middle point to divide the array into two halves:
middle m = (l+r)/2
2. Call mergeSort for first half:
Call mergeSort(arr, l, m)
3. Call mergeSort for second half:
Call mergeSort(arr, m+1, r)
4. Merge the two halves sorted in step 2 and 3:
Call merge(arr, l, m, r)
我最开始merge的时候采用了冒泡法,因为这道题要我们统计swap的次数,但这样会timeout。如果不采用冒泡法的话,要统计swap的次数,想法就是观察后半数组的数字,记录每个数字要往前挪动多少位置。
完整的程序如下: