归并排序的思想:左部分先有序,右部分先有序,在用一个merge(归并)让它整体有序。
merge:两个指针各指向左右两边第一个最小的数,谁小拷贝谁,相等拷贝左边的。
递归实现,实现有序。利用mergeSort变得有序,这个有序能帮我们干很多事情。
迭代实现:
一个数组,步长为1时,两个位置去比较,merge。步长为2时,两组数merge。
1、常见的mergeSort题
1、小和问题:每个数左边的数 比自己小的数都累加起来,最后求和。
两种标准:
标准一:到达i位置时,arr[i]左边比arr[i]小的数加起来,i++
标准二:到达i位置时,arr[i]右边有几个数比arr[i]大,就加几个arr[i]
每一个数都是,先和最近的右组看几个数比自己大。
2、求一个数组中有多少个逆序对
逆序对:当左边的数与右边的数是降序时,就构成一个逆序对
思路:merge从右边开始,数组右边开始放数,相等从右往左排
3、一个数组arr[ ],求这个数组中有多少个组?num数大于右边的数*2,则是一组.
技巧:
①先算完,再来merge合并。
②左闭右开的使用
③不回退技巧,来自于dandiaoxin
总结:利用这三个题,可以总结出一个数左边或者右边有几个什么的,都可以往这上面靠