栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

洛谷 python P1908 逆序对 归并

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

洛谷 python P1908 逆序对 归并

def merge_sort(arr):
    
    s = 0
    
    if len(arr) <= 1: 
        return 
    
    mid = len(arr) // 2
    
    l = arr[:mid]
    r = arr[mid:]
    
    s += merge_sort(l) + merge_sort(r)
    
    i = j = k = 0
    
    while(i < len(l) and j < len(r)):
        if(l[i] <= r[j]):
            arr[k] = l[i]
            i += 1
            k += 1
        else:
            arr[k] = r[j]
            j += 1
            k += 1
            s += len(l) - i     
    while(i < len(l)):
        arr[k] = l[i]
        i += 1
        k += 1
    while(j < len(r)):
        arr[k] = r[j]
        j += 1
        k += 1
    
    return s

n = int(input())
arr = [int(i) for i in input().split()]

print(merge_sort(arr))

n=int(input())
arr=[0]
arr+=[int(x) for x in input().split()]
ans=0
arr2=[0]*500010
def merge(l,r):#归并排序
    global ans
    if l==r:
        return
    mid=int((l+r)/2)
    i=l
    k=l
    j=mid+1
    merge(l,mid)
    merge(mid+1,r)
    while(i<=mid and j<=r):
        if(arr[i]<=arr[j]):
            arr2[k]=arr[i]
            k+=1
            i+=1
        else:
            arr2[k]=arr[j]
            k+=1
            j+=1
            ans+=(mid-i+1)
    while(i<=mid):
        arr2[k]=arr[i]
        k+=1
        i+=1
    while(j<=r):
        arr2[k]=arr[j]
        k+=1
        j+=1
    for m in range(l,r):#复制回原数组
        arr[m]=arr2[m]
    print(ans)
merge(1,n)

print(arr)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743972.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号