案例四
荷兰国旗问题
三色排序问题
对只包含0,1,2的整数数组进行排序,要求使用交换、原地排序,而不是利用计数进行排序,做到0全在数组左边,1在中间,2在右边
本题主要过程和快排划分过程类似
测试用例:
arr = [1,1,0,0,2,1,1,0]
输出:[0,0,0,1,1,1,1,2]
解题思路:
在数组左侧设置一个0区域,初始长度为0,在数组右侧设置一个2区域,初始长度为0
从左右到遍历,如果当前值为1,直接跳到下一个位置。
若当前数为0,则将其与0区域的下一个元素交换,并将0区域向右扩散。
若当前数为2,则将其与2区域的前一个元素交换,并将2区域向前扩散。判断交换后的当前值是否还需再次交换
直至当前位置与2区域的左边界相等为止
时间复杂度为O(n),空间复杂度为O(1)
def sort(arr):
if not arr:
return arr
index0 = 0
index2 = len(arr)-1
i = 0
while i <= index2:
if arr[i] == 0:
exchange(arr,i,index0)
index0 += 1
if arr[i] == 2: