Seeking inverse number (python) based on divide and conquer merge sort

 

 

 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     ifJ < LENB:
 16          C = C + B [J:]
 . 17      return C
 18 is              
. 19      
20 is  DEF merge_sort (L):
 21 is      IF len (L) ==. 1 :
 22 is          return L
 23 is      the else :
 24          A = merge_sort (L [0: len (L) // 2 ])
 25          B = merge_sort (L [len (L) // 2 :])
 26 is          return Merge (A, B)
 27  
28  # the following is a reverse seek 
29  
30  DEF merge_count (A, B) :
 31 is      # Merge several simultaneous reverse 
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])

 

Guess you like

Origin www.cnblogs.com/chong-blog/p/11879677.html