Explicación detallada del problema de la bandera holandesa.

Pregunta sobre la bandera holandesa

1. Descripción del problema

[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-5ryPCHtm-1603712259610)(%E8%8D%B7%E5%85%B0 %E5%9B%BD% E6%97%97%E9%97%AE%E9%A2%98.assets/image-20201026193457980.png)]

2. Solución

Insertar descripción de la imagen aquí

  • Si el número actual cur<número, entonces ++less, cur++
  • Si el número actual cur>número, entonces cur,–más
  • Si el número actual cur=número, entonces cur++

3. Código

/**
 * 荷兰国旗问题
 * @author tyeerth
 * @date 2020/10/26 - 19:19
 */
public class NetherLandsFlag {
    
    
    public static int[] partition(int[] arr ,int L ,int R ,int number){
    
    
        //小于number的区域
        int less = L - 1;
        //大于number的区域
        int more = R ;
        //当前指针的移动
        int cur  = L;
        //当前指针不能达到大于区域
        while (cur < more){
    
    
            if (arr[cur] < number){
    
    
                swap(arr,++less,cur++);
            }
            else if (arr[cur] > number){
    
    
                swap(arr,cur,--more);
            }
            else {
    
    
                cur++;
            }
        }
        //返回相等区域的下角标
        return new int[]{
    
    less+1,more-1};
    }
    public static void swap(int[] arr, int i, int j) {
    
    
        // ^ 为异或运算。
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }
    // for test
    public static int[] generateArray() {
    
    
        int[] arr = new int[10];
        for (int i = 0; i < arr.length; i++) {
    
    
            arr[i] = (int) (Math.random() * 5);
        }
        return arr;
    }

    // for test
    public static void printArray(int[] arr) {
    
    
        if (arr == null) {
    
    
            return;
        }
        for (int i = 0; i < arr.length; i++) {
    
    
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
    
    
        int[] test = generateArray();

        printArray(test);
        int[] res = partition(test, 0, test.length - 1, 1);
        printArray(test);
        System.out.println(res[0]);
        System.out.println(res[1]);

    }

}

Supongo que te gusta

Origin blog.csdn.net/qq_45372719/article/details/109296862
Recomendado
Clasificación