问题描述
解题思路
代码
# -*- coding:utf-8 -*-
def sort_and_count(A):
if len(A) == 1:
return A, 0
mid = len(A)//2
left, count_left = sort_and_count(A[:mid])
print('left:', left, count_left)
right, count_right = sort_and_count(A[mid:])
print('right:', right, count_right)
sort_A, count_merge = merge_and_count3(left, right)
print('merge:', sort_A, count_merge)
return sort_A, count_left + count_right + count_merge
def merge_and_count(left, right):
result = []
count_merge = 0
while len(left) > 0 and len(right) > 0 :
if left[0] <= right[0]:
result.append(left.pop(0))
else:
count_merge += len(left)
result.append(right.pop(0))
result += left
result += right
return result, count_merge
# 若题目改成若ai > 3 * aj, 则是逆序,则更改merge_and_cout函数
def merge_and_count3(left, right):
result = []
count_merge = 0
while len(left) > 0 and len(right) > 0:
if left[0] <= right[0]:
# 若当前非逆序,还要判断left[0]和right后面的一些
j = 1
while j < len(right) and left[0] < 3 * right[j]: # 直到找到满足条件的为止
j += 1
count_merge += (len(right)-j)
result.append(left.pop(0))
else:
if left[0] > 3 * right[0]: # 若成立,则直接left剩下的全部是逆序
count_merge += len(left)
else: # 若不成立,还得比较
i = 1
while i < len(left) and left[i] < 3 * right[0]: # 直到找到满足条件的为止
i += 1
count_merge += (len(left)-i)
result.append(right.pop(0))
result += left
result += right
return result, count_merge
A = [3,8,5,7,2,4,9,1]
# A = [2,4,1,3,5]
print(sort_and_count(A))