Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
Note:
You are not suppose to use the library's sort function for this problem.
Follow up:
A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.
Could you come up with an one-pass algorithm using only constant space?
class Solution:
# @param A a list of integers
# @return nothing, sort in place
def sortColors(self, A):
if A is None or len(A) == 0: return
count = [0] * 3; res = [0] * len(A)
for i in xrange(len(A)):
count[A[i]] += 1
for i in xrange(1, 3):
count[i] = count[i - 1] + count[i]
for i in reversed(xrange(len(A))):
res[count[A[i]] - 1] = A[i]
count[A[i]] -= 1
for i in xrange(len(A)):
A[i] = res[i]
题目要求用只用一次扫描完成排序~ 设3个指针, p0是指向0的指针, p2是指向2的指针, i是用于遍历的指针。如果当前元素A[i]是2, 则交换A[i]和A[p2]的值, 然后p2前移, i不动, 当i > p2就终止, 这样就排除了2的干扰,因为i前面的元素总是0或1。若A[i]是0, 交换A[i]和A[p0]的值, p0和i都后移, 若A[i]是1, 只要i后移即可, 换句话说, 总是把0往前放。
class Solution:
# @param A a list of integers
# @return nothing, sort in place
def sortColors(self, A):
if A is None or len(A) == 0: return
p0, p2 = 0, len(A) - 1
i = 0
while i <= p2:
if A[i] == 0:
A[p0], A[i] = A[i], A[p0]
p0 += 1; i += 1
elif A[i] == 2:
A[p2], A[i] = A[i], A[p2]
p2 -= 1
else:
i += 1