PHP usa cuatro algoritmos básicos

Mucha gente dice que un algoritmo es el núcleo de un programa, y ​​que un programa es mejor que malo, y la clave está en los pros y los contras del algoritmo del programa. Como phper junior, aunque rara vez entra en contacto con algoritmos. Pero para los cuatro algoritmos básicos de clasificación de burbujas, clasificación por inserción, clasificación por selección y clasificación rápida, creo que todavía tengo que dominarlos.

需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法,归并排序将下面数组中 的值按照从小到大的顺序进行排序。

$arr=array(11,3,56,62,21,66,32,78,36,76,39,88,34);

1.
Introducción a la clasificación de burbujas :

Bubble Sort es un algoritmo de clasificación simple. Visitó repetidamente la secuencia a clasificar, comparó dos elementos a su vez y los intercambió si estaban en el orden incorrecto. El trabajo de visitar la secuencia se repite hasta que no se necesitan más intercambios, es decir, se ha ordenado la secuencia. El origen del nombre de este algoritmo se debe a que cuanto más pequeño sea el elemento, "flotará" lentamente hacia la parte superior de la secuencia a través del intercambio.

paso:

1. Compare elementos adyacentes. Si el primero es más grande que el segundo, intercambie los dos.
2. Haga el mismo trabajo para cada par de elementos adyacentes, desde el primer par al principio hasta el último par al final. En este punto, el último elemento debería ser el número más grande.
3. Repita los pasos anteriores para todos los elementos excepto el último.
4. Continúe repitiendo los pasos anteriores para cada vez menos elementos hasta que no haya un par de números para comparar.

<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39, 2];
//冒泡排序
function bubbleSort($arr) {
    
    
    $len = count($arr);
    //该层循环控制 需要冒泡的轮数
    for ($i = 1; $i < $len; $i++) {
    
    
        //该层循环用来控制每轮 冒出一个数 需要比较的次数
        for ($k = 0; $k < $len - $i; $k++) {
    
    
            if ($arr[$k] > $arr[$k + 1]) {
    
        //从小到大 < || 从大到小 >
                $tmp         = $arr[$k + 1]; // 声明一个临时变量
                $arr[$k + 1] = $arr[$k];
                $arr[$k]     = $tmp;
            }
        }
    }
    return $arr;
}

$arr = bubbleSort($arr);
print_r($arr);

Efecto de clasificación:
Inserte la descripción de la imagen aquí
2. Seleccionar clasificación
Introducción:

La clasificación por selección es un algoritmo de clasificación simple e intuitivo. Funciona de la siguiente manera. Primero busque el elemento más pequeño en la secuencia sin clasificar, guárdelo al comienzo de la secuencia ordenada y luego continúe buscando el elemento más pequeño de los elementos restantes sin clasificar, y luego colóquelo al final de la secuencia ordenada. Y así sucesivamente, hasta que todos los elementos estén ordenados.

<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39, 2];
//选择排序
//实现思路 双重循环完成,外层控制轮数,当前的最小值。内层控制比较次数
function selectSort($arr) {
    
    

    $len = count($arr);

    //$i 当前最小值的位置, 需要参与比较的元素
    for ($i = 0; $i < $len - 1; $i++) {
    
    
        //先假设最小的值的位置
        $p = $i;

        //$j 当前都需要和哪些元素比较,$i 后边的。
        for ($j = $i + 1; $j < $len; $j++) {
    
    
            //$arr[$p] 是 当前已知的最小值
            //比较,发现更小的,记录下最小值的位置;并且在下次比较时,应该采用已知的最小值进行比较。
            $p = ($arr[$p] <= $arr[$j]) ? $p : $j;
        }

        //已经确定了当前的最小值的位置,保存到$p中。
        //如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可
        if ($p != $i) {
    
    
            $tmp     = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最终结果
    return $arr;
}

$arr = selectSort($arr);
print_r($arr);

Inserte la descripción de la imagen aquí
3.
Introducción al tipo de inserción :

La descripción del algoritmo de Insertion Sort es un algoritmo de clasificación simple e intuitivo. Funciona construyendo una secuencia ordenada. Para datos no clasificados, escanee de atrás hacia adelante en la secuencia ordenada, busque la posición correspondiente e insértela. La clasificación por inserción generalmente se implementa mediante la clasificación en el lugar (es decir, una clasificación que solo necesita O (1) espacio adicional), por lo que en el proceso de escaneo de atrás hacia adelante, es necesario desplazar repetidamente los elementos ordenados hacia atrás., Para proporcionar espacio de inserción para los elementos más recientes.

paso:

1. A partir del primer elemento, se puede considerar que el elemento ha sido ordenado
2. Saque el siguiente elemento y escanee de atrás hacia adelante en la secuencia ordenada de elementos
3. Si el elemento (ordenado) es mayor que el nuevo elemento , Mueve el elemento a la siguiente posición
4. Repite el paso 3 hasta que encuentres la posición donde el elemento ordenado es menor o igual que el nuevo elemento
5. Inserta el nuevo elemento en la posición
6. Repite el paso 2

<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39,2];
//插入排序
function insert_sort($arr)
{
    
    
    $len=count($arr);
    for($i=1; $i<$len; $i++) {
    
    
        //获得当前需要比较的元素值
        $tmp = $arr[$i];
        //内层循环控制 比较 并 插入
        for($j=$i-1; $j>=0; $j--) {
    
    
            //$arr[$i];需要插入的元素
            //$arr[$j];需要比较的元素
            if($tmp < $arr[$j])   //从小到大 < || 从大到小 >
            {
    
    
                //发现插入的元素要小,交换位置
                //将后边的元素与前面的元素互换
                $arr[$j+1] = $arr[$j];

                //将前面的数设置为 当前需要交换的数
                $arr[$j] = $tmp;
            } else {
    
    
                //如果碰到不需要移动的元素
                //由于是已经排序好是数组,则前面的就不需要再次比较了。
                break;
            }
        }
    }
    //将这个元素 插入到已经排序好的序列内。
    //返回
    return $arr;
}

$arr = insert_sort($arr);
print_r($arr);

Inserte la descripción de la imagen aquí
4.
Introducción a la clasificación rápida :

La clasificación rápida es un algoritmo de clasificación desarrollado por Tony Hall. En promedio, se necesitan comparaciones Ο (n log n) para ordenar n elementos. En el peor de los casos, se requieren comparaciones Ο (n2), pero esta situación no es común. De hecho, el ordenamiento rápido suele ser significativamente más rápido que otros algoritmos Ο (n log n), porque su bucle interno se puede implementar de manera eficiente en la mayoría de las arquitecturas y en la mayoría de las aplicaciones del mundo real. Los datos pueden determinar la elección del diseño y reducir la posibilidad de términos cuadráticos de tiempo requeridos.

paso:

1. Elija un elemento de la secuencia numérica y llámelo "pivote".
2. Reordene la secuencia de modo que todos los elementos menores que el valor de referencia se coloquen delante de la referencia, y todos los elementos mayores que el valor de referencia se coloquen detrás de la referencia (el mismo número puede ir a cualquier lado). Una vez que la partición sale, el punto de referencia se encuentra en el medio de la secuencia. A esto se le llama operación de partición.
3. Clasifique de forma recursiva las subsecuencias de elementos menores que el valor de referencia y las subsecuencias de elementos mayores que el valor de referencia.

<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39,2];
//快速排序
function quick_sort($arr)
{
    
    
    //判断参数是否是一个数组
    if(!is_array($arr)) return false;

    //递归出口:数组长度为1,直接返回数组
    $length = count($arr);

    if($length<=1) return $arr;

    //数组元素有多个,则定义两个空数组
    $left = $right = array();

    //使用for循环进行遍历,把第一个元素当做比较的对象
    for($i=1; $i<$length; $i++)
    {
    
    
        //判断当前元素的大小
        if($arr[$i] < $arr[0]){
    
      //从小到大 < || 从大到小 >
            $left[]=$arr[$i];
        }else{
    
    
            $right[]=$arr[$i];
        }
    }

    //递归调用
    $left=quick_sort($left);
    $right=quick_sort($right);

    //将所有的结果合并
    return array_merge($left,array($arr[0]),$right);
}

$arr = quick_sort($arr);
print_r($arr);

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_45557228/article/details/112660155
Recomendado
Clasificación