1 """ 2 Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue. 3 Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively. 4 Note: You are not suppose to use the library's sort function for this problem. 5 Example: 6 Input: [2,0,2,1,1,0] 7 Output: [0,0,1,1,2,2] 8 """ 9 """ 10 绝世好题:提供了四种解法 11 传送门:https://blog.csdn.net/qq_17550379/article/details/80499816 12 1.计数排序 13 2.三路快排(回顾liuyubobobo的视频第三章6-9) 14 3.适合此题的三路排序算法 15 4.三指针 16 """ 17 """ 18 解法一:计数排序 19 """ 20 class Solution1: 21 def sortColors(self, nums): 22 """ 23 Do not return anything, modify nums in-place instead. 24 """ 25 count = [0, 0, 0] 26 for i in nums: 27 assert(i >= 0 and i <= 2) 28 #python assert断言是声明布尔值必须为真的判定,如果发生异常就说明表达式为假。 29 #可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。 30 count[i] += 1 31 index = 0 32 for i, num in enumerate(count): 33 for j in range(num): 34 nums[index] = i 35 index += 1 36 37 """ 38 解法二:快速排序(三路),没有随机标兵点 39 """ 40 class Solution2: 41 def sortColors(self, nums: List[int]) -> None: 42 """ 43 Do not return anything, modify nums in-place instead. 44 """ 45 self._sortColors(nums, 0, len(nums)-1) #bug 没写-1 46 def _sortColors(self, nums, l, r): 47 if r <= l: 48 return 49 pivot = l #标定点 50 lt = l #[l+1, lt] <val 51 i = l+1 #[lt+1,gt-1] = val 52 gt = r+1 #[gt, r] > val 53 while i < gt: 54 if nums[i] < nums[pivot]: 55 lt += 1 56 nums[i], nums[lt] = nums[lt], nums[i] 57 i += 1 58 elif nums[i] > nums[pivot]: 59 gt -= 1 60 nums[i], nums[gt] = nums[gt], nums[i] #注意与后面的交换不需要再加i 61 else: 62 i += 1 63 nums[pivot], nums[lt] = nums[lt], nums[pivot] 64 self._sortColors(nums, l, lt-1) #快排交换放在了lt的位置 65 self._sortColors(nums, gt, r) 66 67 """ 68 解法三:适合此题的三路排序算法 69 """ 70 class Solution3: 71 def sortColors(self, nums): 72 """ 73 Do not return anything, modify nums in-place instead. 74 """ 75 zero = -1 76 i = 0 #从0开始向后遍历 77 two = len(nums) 78 while i < two: 79 if nums[i] == 1: 80 i += 1 81 elif nums[i] == 2: 82 two -= 1 83 nums[two], nums[i] = nums[i], nums[two] 84 else: 85 zero += 1 86 nums[zero], nums[i] = nums[i], nums[zero] 87 i += 1 #!!! forget 88 """ 89 解法四:用三个指针 90 i,j,k分别指向最后一个0,1,2 91 """ 92 class Solution4: 93 def sortColors(self, nums): 94 """ 95 Do not return anything, modify nums in-place instead. 96 """ 97 i, j, k = -1, -1, -1 #i,j,k分别指向最后一个0,1,2 98 for m in range(len(nums)): 99 if nums[m] == 0: 100 k += 1 #bug python中写成 nums[++k] 是无效的 101 nums[k] = 2 102 j += 1 103 nums[j] = 1 104 i += 1 105 nums[i] = 0 106 elif nums[m] == 1: 107 k += 1 108 nums[k] = 2 109 j += 1 110 nums[j] = 1 111 else: 112 k += 1 113 nums[k] = 2