欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对三个数值进行排序

程序员文章站 2022-03-03 16:08:30
...
# coding: utf-8
# Name:     coding.py
# Author:   tyler
# Data:     2021/10/16

"""
题目:已知一个list,只包含1,2,3,请你在不借用辅助数组的情况下,从大到小进行排序

思路:借助---三指针。

思考:具体解题思路,借鉴数学归纳法,假设前n-1个数已经排好序了,那么如何将最新的数进行插入就是最关键的步骤。

"""

class Solution(object):
    def get_res(self, nums):
        p1, p2, p3 = -1, -1, -1     # 记录最后一个1,2,3的index

        for i in range(len(nums)):
            cur = nums[i]
            if cur == 1:
                if p1 < 0:          # 1之前没有出现过
                    p1 = i
                else:               # 1之前出现过
                    p1 += 1         # 更新p1-index
            elif cur == 2:
                if p2 < 0:          # 2之前没有出现过
                    if p3 >= 0:
                        # 3出现过,将当前的2与最后一个3之后的数进行替换,并更新p1,p2
                        self.swap(nums, p3+1, i)
                        p2 = p3+1
                        if p1 >= 0:
                            p1 += 1
                    else:           # 2之前出现过
                        # 3没有出现过,此时cur=2最大,放到nums开头即可
                        self.swap(nums, i, 0)
                        p2 = 0
                        if p1 >= 0:
                            p1 += 1
                else:               # 2之前出现过,将当前的2与第一个1进行替换,并更新p1,p2
                    self.swap(nums, p2+1, i)
                    p2 += 1
                    if p1 >= 0:
                        p1 += 1
            else:
                if p3 < 0:          # 3之前没有出现过
                    self.swap(nums, i, 0)
                    p3 += 1
                    # 交换完后,如果末尾是1,直接更新p1
                    if nums[i] == 1:
                        p1 += 1
                    # 交换完后,如果末尾是2,还需要再进行一次交换,更新p2、p1
                    if nums[i] == 2:
                        self.swap(nums, p2+1, i)
                        p2 += 1
                        if p1 >= 0:
                            p1 += 1
                else:               # 3之前出现过
                    self.swap(nums, p3+1, i)
                    p3 += 1
                    # 交换完后,如果末尾是1,直接更新p1
                    if nums[i] == 1:
                        p1 += 1
                    # 交换完后,如果末尾是2,还需要再进行一次交换,更新p2、p1
                    elif nums[i] == 2:
                        self.swap(nums, p2 + 1, i)
                        p2 += 1
                        if p1 >= 0:
                            p1 += 1

        return nums


    def swap(self, nums, i, j):
        nums[i], nums[j] = nums[j], nums[i]


if __name__ == "__main__":
    data = [1,3,3,2,1,3,2]
    solu = Solution()
    res = solu.get_res(data)
    print(res)