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))