Ultra-QuickSort问题:递归、排序、双指针

本文探讨了Ultra-QuickSort问题,重点在于归并排序的合并过程。通过分析归并排序的双指针合并策略,揭示了在不改变元素相对位置的前提下,如何等效于交换相邻数字操作。在双指针合并时,关注的是如何确定交换次数,特别是当需要将一个元素从一个序列移动到另一个序列前面时。通过对每次合并中交换次数的累计,可以计算出整个排序过程中的总交换次数。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值