基于合并排序的分治法求逆序数(python)

 1 #先看看合并排序
 2 def merge(A,B):
 3     lenA,lenB=len(A),len(B)
 4     i,j=0,0
 5     C=[]
 6     while(i<lenA and j<lenB):
 7         if A[i]<B[j]:
 8             C.append(A[i])
 9             i+=1
10         else:
11             C.append(B[j])
12             j+=1
13     if i<lenA:
14         C=C+A[i:]
15     if j<lenB:
16         C=C+B[j:]
17     return C
18             
19     
20 def merge_sort(L):
21     if len(L)==1:
22         return L
23     else:
24         A=merge_sort(L[0:len(L)//2])
25         B=merge_sort(L[len(L)//2:])
26         return merge(A,B)
27 
28 #以下是求逆序
29 
30 def merge_count(A,B):
31     #merge和数逆序同时
32     lenA,lenB=len(A),len(B)
33     i,j,rC=0,0,0
34     C=[]
35     while(i<lenA and j<lenB):
36         if A[i]>B[j]:
37             C.append(B[j])
38             j+=1
39             rC+=lenA-i
40         else:
41             C.append(A[i])
42             i+=1
43     if i<lenA:
44         C=C+A[i:]
45     if j<lenB:
46         C=C+B[j:]
47     return (rC,C)
48     
49 
50 def sort_count(L):
51     if len(L)==1:
52         return (0,L)
53     else:
54         (rA,A)=sort_count(L[0:len(L)//2])
55         (rB,B)=sort_count(L[len(L)//2:])
56         (rC,C)=merge_count(A,B)
57         return (rA+rB+rC,C)
58 
59 L=[4,7,1,2,9,3,0]
60 print(sort_count(L))
61 #output:(13, [0, 1, 2, 3, 4, 7, 9])

猜你喜欢

转载自www.cnblogs.com/chong-blog/p/11879677.html
今日推荐