[Preguntas del examen provincial de 2013] Tres partes en orden



Clasificación en tres partes

Hay muchos algoritmos clásicos para la clasificación general, como 快速排序, 希尔排序etc.

Pero en la aplicación real, a menudo existen requisitos más o menos especiales. No necesitamos aplicar esos algoritmos clásicos, podemos construir una mejor solución de acuerdo con la situación real.

tal como,Ordene los números en una matriz de enteros: haga todos los números negativos a la izquierda, los números positivos a la derecha y 0 en el medio. Tenga en cuenta que la característica del problema es que no se requiere orden en el área de números negativos y en el área de números positivos. ¡Puedes usar esta función para terminar la batalla con un escaneo lineal!

El siguiente programa logra este objetivo, complete los espacios en blanco para completar el código.

while (p<=right){
    
    
            // 元素小于0,交换元素与left的位置
            if (x[p]<0){
    
    
                int t = x[left];
                x[left] =x[p];
                x[p] = t;
                left++;
                p++;
            // 元素大于0,将元素与right的位置交换
            } else if (x[p]>0){
    
    
                int t = x[right];
                x[right] = x[p];
                x[p] = t;
                right--;
            // 元素等于0    
            } else {
    
    
               _______________________________ // 代码填空
            }
        }

Volver arriba


1. Análisis de pasos

Inserte la descripción de la imagen aquí
Según el código ya dado, no es difícil inferir el tercer caso x[p]==0, pero la operación interna específica debe calcularse en base a las dos primeras partes. Como se muestra en la figura anterior, se ha realizado un análisis simple, y se puede ver que cuando la lógica interna está p++, está exactamente en línea, y el resto de los socios de cálculo pueden intentarlo.

  • Aquí es el corazón p, left, righttres subíndices cambios, de hecho, pueden ser vistos como p atravesada por la matriz de punteros (auxiliar), el papel principal es para iterar el valor de determinación, a continuación, la división regional.

Volver arriba


En segundo lugar, el código completo

package 蓝桥杯;

public class Test04_三部排序 {
    
    

    static void sort(int[] x) {
    
    
        int p = 0;
        int left = 0;
        int right = x.length - 1;

        while (p <= right) {
    
    
            // 元素小于0,交换元素与left的位置
            if (x[p] < 0) {
    
    
                int t = x[left];
                x[left] = x[p];
                x[p] = t;
                left++;
                p++;
                // 元素大于0,将元素与right的位置交换
            } else if (x[p] > 0) {
    
    
                int t = x[right];
                x[right] = x[p];
                x[p] = t;
                right--;
                // 元素等于0
            } else {
    
    
                p++;
            }
        }
    }

    public static void main(String[] args) {
    
    
        int[] arr = {
    
    25,18,-2,0,16,-5,19,-16,25,-3,0};
        sort(arr);
        for (int i = 0; i < arr.length ; i++) {
    
    
            System.out.print(arr[i] + " ");
        }
    }
}

Inserte la descripción de la imagen aquí

Volver arriba


Supongo que te gusta

Origin blog.csdn.net/qq_45797116/article/details/113761330
Recomendado
Clasificación