分治思想
- 分解
- 解决子问题
- 合并
可以使用分治思想的问题有哪些特点:
- 原问题与分解成的子问题具有相同的模式
- 原问题分解成的子问题可以独立求解,子问题之间没有相关性
- 具有分解终止条件
- 可以将子问题合并成原问题,并且合并操作复杂度不能太高
以下以面向对象的方式实现归并排序相关功能:
class Merge_sorter:
def __init__(self):
self._array = None
self._reverse_degree = 0
def merge_sort(self,arr):
"""
对传入的数组进行归并排序,返回排好序的数组
:param arr:
:return:
"""
self._array = arr
self.merge_sort_helper(0,len(self._array)-1)
return self._array
def get_reverse_degree(self,arr):
"""
借助归并排序的分治思想,在归并排序过程中计算数组逆序数
:param arr:
:return:
"""
self.merge_sort(arr)
return self._reverse_degree
def merge_sort_helper(self,left,right):
if left<right:
mid = left + (right-left)//2
self.merge_sort_helper(left,mid)
self.merge_sort_helper(mid+1, right)
self.merge(left,mid,right)
def merge(self,left,mid,right):
temp_array = []
left_i = left
right_i = mid+1
while left_i<=mid and right_i <=right:
if self._array[left_i]<self._array[right_i]:
temp_array.append(self._array[left_i])
left_i+=1
else:
temp_array.append(self._array[right_i])
right_i += 1
self._reverse_degree += mid+1-left_i
while left_i<=mid:
temp_array.append(self._array[left_i])
left_i += 1
while right_i <=right:
temp_array.append(self._array[right_i])
right_i += 1
indx = left
for value in temp_array:
self._array[indx] = value
indx += 1