divide and conquer applications
This commit is contained in:
parent
6b50ac0265
commit
1f66f823bc
51
python/38_divide_and_conquer/merge_sort_counting.py
Normal file
51
python/38_divide_and_conquer/merge_sort_counting.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: UTF-8 -*-
|
||||||
|
|
||||||
|
inversion_num = 0
|
||||||
|
|
||||||
|
|
||||||
|
def merge_sort_counting(nums, start, end):
|
||||||
|
if start >= end:
|
||||||
|
return
|
||||||
|
|
||||||
|
mid = (start + end)//2
|
||||||
|
merge_sort_counting(nums, start, mid)
|
||||||
|
merge_sort_counting(nums, mid+1, end)
|
||||||
|
merge(nums, start, mid, end)
|
||||||
|
|
||||||
|
|
||||||
|
def merge(nums, start, mid, end):
|
||||||
|
global inversion_num
|
||||||
|
i = start
|
||||||
|
j = mid+1
|
||||||
|
tmp = []
|
||||||
|
while i <= mid and j <= end:
|
||||||
|
if nums[i] <= nums[j]:
|
||||||
|
inversion_num += j - mid - 1
|
||||||
|
tmp.append(nums[i])
|
||||||
|
i += 1
|
||||||
|
else:
|
||||||
|
tmp.append(nums[j])
|
||||||
|
j += 1
|
||||||
|
|
||||||
|
while i <= mid:
|
||||||
|
# 这时nums[i]的逆序数是整个nums[mid+1: end+1]的长度
|
||||||
|
inversion_num += end - mid
|
||||||
|
tmp.append(nums[i])
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
while j <= end:
|
||||||
|
tmp.append(nums[j])
|
||||||
|
j += 1
|
||||||
|
|
||||||
|
nums[start: end+1] = tmp
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print('--- count inversion number using merge sort ---')
|
||||||
|
# nums = [5, 0, 4, 2, 3, 1, 6, 8, 7]
|
||||||
|
nums = [5, 0, 4, 2, 3, 1, 3, 3, 3, 6, 8, 7]
|
||||||
|
print('nums : {}'.format(nums))
|
||||||
|
merge_sort_counting(nums, 0, len(nums)-1)
|
||||||
|
print('sorted: {}'.format(nums))
|
||||||
|
print('inversion number: {}'.format(inversion_num))
|
Loading…
Reference in New Issue
Block a user