lintCode 846. 多关键字排序之python实现

class Solution:
    """
    @param array: the input array
    @return: the sorted array
    """
    def multiSort(self, array):
        self.quickSort(array, 0, len(array) - 1, 1, False)
        left, right = 0, 1
        while right < len(array):
            left, right, hasSame = self.sortSameScore(array, left, right)
            if hasSame:
                self.quickSort(array, left, right - 1, 0, True)
            left = right
            right += 1
        return array
    def quickSort(self,arr, left, right, index, reverse):
        if left < right:
            base = self.helper(arr, left, right, index, reverse)
            self.quickSort(arr, left , base - 1, index, reverse)
            self.quickSort(arr, base + 1, right, index, reverse)
    def helper(self,arr,left,right, index, reverse):
        base = arr[left]
        while left < right:
            if not reverse:
                while left < right and arr[right][index] <= base[index]:
                    right -= 1
                arr[left],arr[right] = arr[right],arr[left]
                while left < right and arr[left][index] >= base[index]:
                    left += 1
                arr[left],arr[right] = arr[right],arr[left]
            elif reverse:
                while left < right and arr[right][index] >= base[index]:
                    right -= 1
                arr[left],arr[right] = arr[right],arr[left]
                while left < right and arr[left][index] <= base[index]:
                    left += 1
                arr[left],arr[right] = arr[right],arr[left]
        arr[left] = base
        return left

    def sortSameScore(self, arr, left, right):
        hasSame = False
        while right < len(arr) and arr[right][1] == arr[left][1]:
            right += 1
        if right - left > 1:
            hasSame = True
        return left, right, hasSame

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值