Estructura de datos: algoritmo de clasificación común (3) - clasificación de intercambio (clasificación de burbujas, clasificación rápida)

(1) Tipo de burbuja
① Principio:

En el intervalo desordenado, al comparar números adyacentes, burbujee el número más grande hasta el final del intervalo desordenado y continúe este proceso hasta que la matriz esté en orden como un todo.

②Implementación del código:
import java.util.Arrays;
//冒泡排序:  时间复杂度O(n^2)  空间复杂度:O(1)
public class bubbleSort {
    
    
    public static void main(String[] args) {
    
    
        int[] array={
    
    5,8,1,2,5,22,44,15,3,0,48};
        System.out.println(Arrays.toString(array));
        bubble(array);
        System.out.println(Arrays.toString(array));
    }
    public static void bubble(int[] array){
    
    
        for (int i = 0; i < array.length - 1; i++) {
    
    
            boolean isSorted = true;
            for (int j = 0; j < array.length - i - 1; j++) {
    
    
                // 相等不交换,保证稳定性
                if (array[j] > array[j + 1]) {
    
    
                    int tmp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=tmp;
                    isSorted = false;
                }
            }
            if (isSorted) {
    
    
                break;
            }
        }
    }
}

Ejecutar captura de pantalla:
Inserte la descripción de la imagen aquí

③Análisis de rendimiento

Inserte la descripción de la imagen aquí** Estabilidad: ** Estable

(2) Clasificación rápida
①Principio-partición:

1. Seleccione un número del intervalo que se ordenará como valor de referencia (pivote) ;
2. Partición: atraviese todo el intervalo para ordenar y coloque el valor más pequeño que el valor de referencia (que puede incluir igual) a la izquierda de el valor de referencia, que será mayor que el valor de referencia El mayor (que puede incluir valores iguales) se coloca en el lado derecho del valor de referencia;
3. Usando la idea de dividir y conquistar , las celdas izquierda y derecha se tratan en de la misma manera hasta la longitud entre celdas == 1, lo que significa que las celdas están en orden o las celdas están en orden. La longitud del intervalo == 0, lo que significa que no hay datos.

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

②Implementación del código:
import java.util.Arrays;

/**
 * 快速排序  时间复杂度:O(n*log2n)~O(n^2)    空间复杂度:O(log2n)~O(n)
 *稳定性:不稳定
 */
public class quickSort {
    
    
    public static void main(String[] args) {
    
    
        int[] array={
    
    4,8,7,5,12,14,0,3,36,24};
        System.out.println(Arrays.toString(array));
        quickSort1(array);
        System.out.println(Arrays.toString(array));
    }
    //快速排序函数
    public static void quickSort1(int[] array){
    
    
        quick(array,0,array.length-1);  //接口
    }
    public static void quick(int[] array,int low,int high){
    
    
        if(low<high){
    
    
            int piv=pivot(array,low,high);
            quick(array,low,piv-1);   //递归实现
            quick(array,piv+1,high);
        }
    }
    //找基准的函数
    public static int  pivot(int[] array,int start,int end){
    
    
        int tmp=array[start];
        while(start<end){
    
    
            while(start<end && array[end]>=tmp){
    
    
                end--;
            }
            //把数值赋值给start
            array[start]=array[end];
            while(start<end && array[start]<=tmp){
    
    
                start++;
            }
            //把start下标的值给end
            if(start>=end){
    
    
                break;
            }else{
    
    
                array[end]=array[start];
            }
        }
        array[start]=tmp;
        return start;
    }
}

Ejecutar captura de pantalla:
Inserte la descripción de la imagen aquí

Implementación del código después de la optimización (el tercer número es el método del medio):
/**
 * @Author: XiShanShan
 * @Description:
 * @Date:Created in 20:21 2021/3/30
 * @Modified By:xss666
 */

import java.util.Arrays;

/**
 * 快速排序  时间复杂度:O(n*log2n)~O(n^2)    空间复杂度:O(log2n)~O(n)
 *稳定性:不稳定
 */
public class quickSort {
    
    
    public static void main(String[] args) {
    
    
        int[] array=new int[1_0000];
        for (int i = 0; i < array.length; i++) {
    
    
            array[i]=i;
        }
        quickSort1(array);
    }
    //快速排序函数
    public static void quickSort1(int[] array){
    
    
        long startTime=System.currentTimeMillis();
        quick(array,0,array.length-1);  //接口
        long endTime=System.currentTimeMillis();
        System.out.println(endTime-startTime); //输出排序所需要的时间
    }

    public static void swap(int[] array,int k,int i){
    
    
        int tmp=array[k];
        array[k]=array[i];
        array[i]=tmp;
    }

    //三数取中法优化
    public static void medianOfThree(int[] array,int low,int high){
    
    
        int mid=(low+high)/2;

        if(array[low]<=array[mid]){
    
    
            swap(array,low,mid);
        }//mid<=low

        if(array[low]>array[high]){
    
    
            swap(array,low,high);
                }//array[low]<=array[high]

        if(array[mid]>array[high]){
    
    
            swap(array,mid,high);
        }  //array[mid]<array[high]
    }
    public static void quick(int[] array,int low,int high){
    
    
        if(low<high){
    
    

            //优化后
            medianOfThree(array,low,high);
            int piv=pivot(array,low,high);
            quick(array,low,piv-1);   //递归实现
            quick(array,piv+1,high);
        }
    }
    //找基准的函数
    public static int  pivot(int[] array,int start,int end){
    
    
        int tmp=array[start];
        while(start<end){
    
    
            while(start<end && array[end]>=tmp){
    
    
                end--;
            }
            //把数值赋值给start
            array[start]=array[end];
            while(start<end && array[start]<=tmp){
    
    
                start++;
            }
            //把start下标的值给end
            if(start>=end){
    
    
                break;
            }else{
    
    
                array[end]=array[start];
            }
        }
        array[start]=tmp;
        return start;
    }
}

La velocidad de clasificación de código optimizada se mejorará enormemente:

Después de ordenar una matriz con un tamaño de datos de 1_0000, el tiempo se ahorra aproximadamente 26 ms

③Análisis de rendimiento

Inserte la descripción de la imagen aquíEstabilidad: inestable

Supongo que te gusta

Origin blog.csdn.net/qq_47364122/article/details/115331277
Recomendado
Clasificación