abbarnes icon

Count Inversions [Python 3]

abbarnes | PRO | 01/21/18 06:45:46 PM UTC | 0 ⭐ | 266 👁️ | Never ⏰ | []
Python |

1.36 KB

|

None

|

0 👍

/

0 👎

#Count Inversions
#Counts the number of inversions in a list.  Inverions defined as occurence of list[i] > list[j] for all combinations of i,j where i<j 
# uses python3
 
#NOTE:  ONLY MINIMAL TESTING DONE AT THIS POINT
#todo: test more lists
 
import logging as log
 
def merge_count(list0, list1):
    log.info("Merging ", list0, list1)
    count = 0
    merged = []
    while list0 and list1:
        if list0[0] <= list1[0]:
            merged.append(list0.pop(0))
        else:
            merged.append(list1.pop(0))
            count += len(list0)
    merged += list0
    merged += list1
    log.info("Result:  ", merged, " counted ", count, " inversions")
    return(merged, count)
 
def Count_Inversions(inv_list, inversions = 0):
    log.info("Processing ", inv_list, " with inv count ", inversions)
    #base case
    length = len(inv_list)
    if length <= 1:
        log.info("hit bottom with list ", inv_list, " inv count ", inversions)
        return (inv_list,0)
    #recursive case
    index = int(length/2)
    list0 = inv_list[:index]
    list1 = inv_list[index:]
    log.info("Splitting ", inv_list, " into ", list0, " and ", list1)
 
    left = Count_Inversions(list0)
    right = Count_Inversions(list1)
    #mc = merge_count(list0, list1)
    merged = merge_count(left[0],right[0])
    return (merged[0], left[1] + right[1] + merged[1])

Comments