给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
class Solution {
public void sortColors(int[] nums) {
recur(nums, 0, nums.length - 1);
}
private static void recur(int[] array, int start_real, int end_real) {
int start = start_real;
int end = end_real;
int temp = array[start];
start++;
while (start < end) {
if (array[start] < temp && array[end] > temp) {
start++;
end--;
continue;
}
if (array[start] >= temp && array[end] <= temp) {
if (array[start] == temp && array[end] == temp) {
start++;
end--;
continue;
}
int temp_02 = array[start];
array[start] = array[end];
array[end] = temp_02;
start++;
end--;
continue;
}
if (array[start] >= temp && array[end] > temp) {
end--;
continue;
}
if (array[start] < temp && array[end] <= temp) {
start++;
continue;
}
}
if (start == end) {
if (temp < array[start]) {
int temp_01;
array[start_real] = array[start - 1];
array[start - 1] = temp;
if (end - 2 > start_real) {
recur(array, start_real, end - 2);
}
if (end_real > start) {
recur(array, start, end_real);
}
} else {
array[start_real] = array[start];
array[start] = temp;
if (end - 1 > start_real) recur(array, start_real, end - 1);
if (end_real > start + 1) recur(array, start + 1, end_real);
}
} else if (start > end) {
array[start_real] = array[end];
array[end] = temp;
if (end - 1 > start_real) {
recur(array, start_real, end - 1);
}
if (end_real > start) {
recur(array, start, end_real);
}
} else {
}
}
}
AC截图
别人的快排代码
public int pivot(int[] A, int left, int right){
int p = A[left];
while(left < right){
while(left < right && A[right] >= p)
right--;
if(left < right){
A[left] = A[right];
left++;
}
while(left < right && A[left] <= p)
left++;
if(left < right){
A[right] = A[left];
right--;
}
}
A[left] = p;
return left;
}
public void qs(int[] A, int left, int right){
int i;
if(left < right){
i = pivot(A, left, right);
qs(A, left, i - 1);
qs(A, i + 1, right);
}
}