Я пытаюсь реализовать знаменитый: подсчет инверсий с использованием сортировки слияния. Я написал для этого код. Код работает хорошо для небольших данных. У меня было несколько тестовых примеров, в которых я проверил ответ. Но код занимает очень много времени, когда вход большой (100000). Итак, я просто хочу убедиться, что сложность моего кода - O (N lgN) и не выше (будучи более сложной, может потребоваться больше времени). Вот мой код в Python:Количество инверсий с использованием сортировки слияния
def merge_sort(u_list,inv):
if(len(u_list) == 1): return 0
if(len(u_list)>1):
mid=len(u_list)//2
l_list=u_list[:mid]
r_list=u_list[mid:]
a=merge_sort(l_list,inv)
b=merge_sort(r_list,inv)
count=0
i=0
j=0
k=0
track=0
while i<len(l_list) and j<len(r_list) :
if l_list[i]<=r_list[j]:
u_list[k]=l_list[i]
track+=1
i+=1
k+=1
else: #r_list[j]<l_list[i]
u_list[k]=r_list[j]
inv=inv+(len(l_list)-track)
j+=1
k+=1
while i<len(l_list) :
u_list[k]=l_list[i]
i+=1
k+=1
while j<len(r_list):
u_list[k]=r_list[j]
j+=1
k+=1
count=inv+a+b
return count
inv=0
m=0
u_list=[]
x=0
for m in range(0,100000):
x=int(input())
u_list.append(x)
foo = merge_sort(u_list,inv)
print(foo)
можете ли вы оформить свой код? т. е. вы уверены, что не тратит больше времени на ввод? – Ashalynd
Я не вижу ничего плохого, поэтому я согласен, что проблема может заключаться в чтении и анализе ввода. Поместите 'print' перед' foo = merge_sort (u_list, inv) ', чтобы убедиться, что он закончил этот этап и сортирует. –
related: 'O (n log n)' реализация ['sort_and_count()'] (http://stackoverflow.com/a/2989341/4279) – jfs