http://cs101.openjudge.cn/practice/02299/
思路:
Ultra-QuickSort题目使用的排序方法是归并排序(本题解答是基于归并排序的解法,用其他解法如冒泡排序时间复杂度较高)。在归并排序中,将序列递归地分为左右两半,分别排序后再合并到一起。在归并排序中,合并函数的书写是重点,也是本题关注的点。在两个有序序列进行合并的过程中,若通过交换两个相邻数字的位置来实现合并,一共需要交换多少次,就是本题需要解决的问题。
以下是归并排序(mergesort)的代码。merge(arr,l,m,r)
函数是合并两个有序序列的函数。函数的主体是三个while。第一个while运用双指针法,是对两个序列的合并,涉及到了元素位置的改变。第二、三个while是简单地将L1或L2中的剩余有序元素复制到arr队尾,并不涉及到元素位置的改变。所以只需关注第一个while的内容。
#归并排序
import sys
sys.setrecursionlimit(100000)
def merge(arr,l,m,r):
'''对l到m和m到r两段进行合并'''
n1=m-l+1#L1长
n2=r-m#L2长
L1=arr[l:m+1]
L2=arr[m+1:r+1]
''' L1和L2均为有序序列'''
i,j,k=0,0,l#i为L1指针,j为L2指针,k为arr指针
'''双指针法合并序列'''
while i<n1 and j<n2:
if L1[i]<=L2[j]:
arr[k]=L1[i