计算数组逆序数(使用归并排序的分治思想)

分治思想

  1. 分解
  2. 解决子问题
  3. 合并

可以使用分治思想的问题有哪些特点:

  1. 原问题与分解成的子问题具有相同的模式
  2. 原问题分解成的子问题可以独立求解,子问题之间没有相关性
  3. 具有分解终止条件
  4. 可以将子问题合并成原问题,并且合并操作复杂度不能太高

以下以面向对象的方式实现归并排序相关功能:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值