AcWing算法基础课-D3-python模板-788逆序对数量

33 篇文章 0 订阅
23 篇文章 0 订阅

788逆序对数量

1、内存不够了

def merge_sort(q,l,r):
    res = 0
    mid = l+r>>1
    tmp,i,j = [],l,mid+1
    
    if l>=r:
        return 0
    res += merge_sort(q,l,mid)
    res += merge_sort(q,mid+1,r)
    
    while (i<=mid and j<=r):
        if q[i]<=q[j]:
            tmp.append(q[i])
        else:
            tmp.append(q[j])
            res += mid-i+1
    if i<=mid:
        tmp += q[i,mid+1]
    if j<=r:
        tmp += q[j,r+1]
    tmp[l:r+1] = tmp[:]
    return res
    
n = int(input())
nums = list(map(int,input().split()))
print(merge_sort(nums,0,n-1))
    

2、原来是忘记调整i、j指针了。

def merge_sort(q,l,r):
    if l>=r:
        return 0   
    mid = l+r>>1
    tmp,i,j = [],l,mid+1
    

    res = merge_sort(q,l,mid)+merge_sort(q,mid+1,r)
    
    while (i<=mid and j<=r):
        if q[i]<=q[j]:
            tmp.append(q[i])
            i += 1
        else:
            tmp.append(q[j])
            j += 1
            res += mid-i+1
    if i<=mid:
        tmp += q[i:mid+1]
    if j<=r:
        tmp += q[j:r+1]
    
    q[l:r+1] = tmp[:]
    return res
    
n = int(input())
nums = list(map(int,input().split()))
print(merge_sort(nums,0,n-1))
    

二、复习快排代码-785

1、x写成中点就可以,写成q[l]就不行

def quick_sort(q,l,r):
    if l>=r:
        return
    
    x,i,j=q[l+r>>1],l-1,r+1
    # 注意是i<j
    while i<j:
        i += 1
        while q[i]<x:
            i += 1
            
        j -= 1
        while q[j]>x:
            j -= 1
        # 别忘了if
        if i<j:
            q[i],q[j] = q[j],q[i]
        
    quick_sort(q,l,j)
    quick_sort(q,j+1,r)

n = int(input())
nums = list(map(int,input().split()))
quick_sort(nums,0,n-1)
print(" ".join(map(str,nums)))
    

三、快选-786

1、我醉了,应该是网站的调试出bug了。一直不过,直接提交就ok了。

a = list(map(int,input().split()))
n,k = a[0],a[1]
nums = list(map(int,input().split()))

def quick_sort(q,l,r,k):
    if l>=r:
        return q[l]
    x,i,j=q[l+r>>1],l-1,r+1
    
    while i<j:
        i += 1
        while q[i]<x:
            i += 1
        j -= 1
        while q[j]>x:
            j -= 1
        if i<j:
            q[i],q[j]=q[j],q[i]
    sl = j-l+1
    if k<=sl:
        return quick_sort(q,l,j,k)
    else:
        return quick_sort(q,j+1,r,k-sl)
        
b = quick_sort(nums,0,n-1,k)
print(b)

四、归并排序-787

注意切片中间是冒号:

def merge_sort(q,l,r):
    if l>=r:
        return
    
    mid = l+r>>1
    tmp,i,j=[],l,mid+1
    
    merge_sort(q,l,mid)
    merge_sort(q,mid+1,r)
    
    while(i<=mid and j<=r):
        if q[i]<=q[j]:
            tmp.append(q[i])
            i += 1
        else:
            tmp.append(q[j])
            j += 1
    if i<=mid:
        tmp += q[i:mid+1]
    if j<=r:
        tmp += q[j:r+1]
    q[l:r+1] = tmp[:]
    
n = int(input())
nums = list(map(int,input().split()))
merge_sort(nums,0,n-1)
print(" ".join(map(str,nums)))

逆序对数量-788

1、没咋过脑就写完了,明天再复习一下~主要是跨界的处理。

def merge_sort(q,l,r):
    if l>=r:
        return 0
    
    mid = l+r>>1
    tmp,i,j=[],l,mid+1
    
    res = merge_sort(q,l,mid)+merge_sort(q,mid+1,r)
    
    while (i<=mid and j<=r):
        if q[i]<=q[j]:
            tmp.append(q[i])
            i += 1
        else:
            tmp.append(q[j])
            j += 1
            res += mid-i+1
        
    if i<=mid:
        tmp += q[i:mid+1]
    if j<= r:
        tmp += q[j:r+1]
    q[l:r+1] = tmp[:]
    return res
    
    
n = int(input())
nums = list(map(int,input().split()))
print(merge_sort(nums,0,n-1))
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值