一、786. 第k个数 - AcWing题库
三路快速排序
import random
def func(nums, start, end):
if start >= end:
return
idx = random.randint(start, end)
base = nums[idx]
i, j, m = start, start, end + 1
while j < m:
if nums[j] < base:
nums[i], nums[j] = nums[j], nums[i]
i += 1
j += 1
elif nums[j] > base:
nums[j], nums[m - 1] = nums[m - 1], nums[j]
m -= 1
else:
j += 1
func(nums, start, i - 1)
func(nums, m, end)
n, k = map(int, input().split())
nums = list(map(int, input().split()))
func(nums, 0, len(nums) - 1)
print(nums[k - 1])
二、787. 归并排序 - AcWing题库
递归归并排序
def merge_sort(nums):
n = len(nums)
if n <= 1:
return nums
mid = n // 2
left = merge_sort(nums[:mid])
right = merge_sort(nums[mid:])
res = []
i, j = 0, 0
# 左右列表长度
while i < mid and j < n - mid:
if right[j] < left[i]:
res.append(right[j])
j += 1
else:
res.append(left[i])
i += 1
# 将剩下的添加到末尾
res += left[i:]
res += right[j:]
return res
n = int(input())
nums = list(map(int, input().split()))
nums = merge_sort(nums)
for x in nums:
print(x, end = ' ')
三、788. 逆序对的数量 - AcWing题库
归并排序时计数
# 使用归并排序时计数
def merge_inversions(nums):
n = len(nums)
if n <= 1:
return 0, nums
mid = n // 2
cnt_l, left = merge_inversions(nums[:mid])
cnt_r, right = merge_inversions(nums[mid:])
i, j = 0, 0
res = []
cnt = 0
while i < mid and j < n - mid:
if left[i] > right[j]:
res.append(right[j])
j += 1
cnt += mid - i # 注意这里,是left从i到结尾都是算逆序
else:
res.append(left[i])
i += 1
res += left[i:]
res += right[j:]
# print(cnt, cnt_l, cnt_r)
return cnt + cnt_l + cnt_r, res
n = int(input())
nums = list(map(int, input().split()))
cnt, _ = merge_inversions(nums)
print(cnt)
完
感谢你看到这里!一起加油吧!