Descripción del título
Ahora hay una matriz de n objetos, donde el color de los objetos es rojo, blanco o azul, clasifique la matriz de manera que los objetos del mismo color sean adyacentes y el orden de los colores sea rojo, blanco, azul
Usamos 0,1,2 para representar los colores rojo, blanco y azul respectivamente.
Nota:
Esta pregunta requiere que no pueda usar la función de biblioteca de clasificación.
Extensión:
Una solución muy sencilla es un algoritmo de clasificación de conteo de dos pasos.
Primero: iterar a través de la matriz, registrando 0,1 , El número de 2, y luego reescribe la matriz, primero escribe 0, luego escribe 1, y luego escribe 2
Puedes dar un algoritmo de un paso que puede resolver este problema en una complejidad espacial constante Es?
Análisis
- En términos simples, una matriz de 0,1,2 se ordena por un algoritmo in situ.
- Establezca los punteros izquierdo y derecho, respectivamente, el lado izquierdo es todo 0, la izquierda apunta al primer elemento distinto de cero desde la izquierda, la derecha apunta a la derecha, el primer elemento no 2.
- Cur izquierda se garantiza que sea 0 y este último 1.
- Cur se mueve de izquierda a derecha y salta cuando encuentra 1; cuando encuentra 2, intercambia con el elemento de la derecha. El elemento de la derecha es 0 o 1. En este momento, la derecha se reemplaza por 2, derecha–; cuando 0, y la izquierda En el intercambio de elementos, dado que el lado izquierdo de cur es solo 0 o 1, entonces el elemento señalado por la izquierda debe ser 1. Después de este intercambio, el elemento señalado por la izquierda se convierte en 0, y la izquierda se puede mover hacia la derecha. En este momento, el elemento en cur es 1, y debe moverse hacia la derecha.
código java
public class Solution {
public void sortColors(int[] A) {
if(A == null || A.length <= 1){
return;
}
//本质就是0 1 2元素的数组排序
//left 从左向右 指向第一个非0元素
int left = 0;
while(left < A.length && A[left] == 0){
left++;
}
//right 从右向左 指向第一个非2 元素
int right = A.length-1;
while(right > 0 && A[right] == 2){
right--;
}
int cur = left;
while(cur <= right){
if(A[cur] == 1){
cur++;
}else if(A[cur] == 0){
swap(A,cur,left);
left++;
cur++;
}else{
swap(A,cur,right);
right--;
}
}
}
public void swap(int [] A, int i ,int j){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}