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的次数,想法就是观察后半数组的数字,记录每个数字要往前挪动多少位置。
完整的程序如下:

这篇博客回顾了Merge Sort算法,强调了其分治思想和在排序过程中如何有效地合并已排序段。通过详细解释,指出在解决特定问题时,冒泡法可能导致超时,而应关注如何统计元素交换(inversions)的次数。提供了实现Merge Sort的伪代码,并给出了完整程序的参考链接。
1万+

被折叠的 条评论
为什么被折叠?



