php 实现常见的排序算法

  1. 冒泡排序(bubble sort)
    从前往后,也可以从后往前,用第一个元素和第二个元素进行比较,大于第二个元素就交换,然后用第二个元素和第三个元素进行比较,大于第三个元素就交换,直到最大的数到了最后一个,之后在从前往后,直到最大的数到了倒数第二个,以此类推,直到剩下一个元素。
     1 function bubble_sort($arr)
     2 {
     3     $len = count($arr) - 1;
     4     for ($i = 0; $i < $len; $i++) {
     5         $state = 0;
     6         for ($j = 0; $j < $len - $i; $j++) {
     7             if ($arr[$j] > $arr[$j + 1]) {
     8                 $tmp         = $arr[$j];
     9                 $arr[$j]     = $arr[$j + 1];
    10                 $arr[$j + 1] = $tmp;
    11                 $state       = 1;
    12             }
    13         }
    14 
    15         if (!$state) {
    16             return $arr;
    17         }
    18     }
    19     return $arr;
    20 }
  2. 选择排序
    从剩余元素中找到最小值或者最大值和剩余元素中的第一个元素进行交换
     1 function select_sort($arr)
     2 {
     3     $len = count($arr) - 1;
     4     for ($i = 0; $i < $len; $i++) {
     5         $pos = $i;
     6         for ($j = $i + 1; $j <= $len; $j++) {
     7             if ($arr[$j] < $arr[$pos]) {
     8                 $pos = $j;
     9             }
    10         }
    11 
    12         if ($pos != $i) {
    13             $tmp       = $arr[$pos];
    14             $arr[$pos] = $arr[$i];
    15             $arr[$i]   = $tmp;
    16         }
    17     }
    18     return $arr;
    19 }
  3. 快速排序
    从数组中取一个分界值,然后将数组分为左右两个数组,左数组中为小于分界值的元素,右数组中为大于等于分界值的元素;递归进行拆分,直到元素剩余一个,再将左数组、分界值、右数组进行合并。
    function quick_sort($arr)
    {
        $len      = count($arr);
        if ($len <= 1) {
            return $arr;
        }
        $base     = $arr[0];
        $leftArr  = [];
        $rightArr = [];
        for ($i = 1; $i < $len; $i++) {
            if ($arr[$i] < $base) {
                $leftArr[] = $arr[$i];
            } else {
                $rightArr[] = $arr[$i];
            }
        }
    
        $leftArr  = quick_sort($leftArr);
        $rightArr = quick_sort($rightArr);
        return array_merge($leftArr, [$base], $rightArr);
    }
  4. 插入排序
    将未排序的元素和已排序的元素进行比较,放到合适的位置,默认第一个元素为已排序的数组元素。

    function insert_sort($arr)
    {
        $len = count($arr);
    
        for ($i = 1; $i < $len; $i++) {// 从第二个元素开始,因为第一个元素就是排好序的
            for ($j = $i; $j > 0; $j--) {// 循环已排序的元素和下一个需要排序的元素
                if ($arr[$j] < $arr[$j - 1]) {// 判断排序元素是否小于前一个元素并往前移动, 否则停止循环
                    $tmp         = $arr[$j - 1];
                    $arr[$j - 1] = $arr[$j];
                    $arr[$j]     = $tmp;
                } else {
                    break;
                }
            }
        }
        return $arr;
    }
posted @ 2022-01-18 15:10  Eʟɪᴀᴜᴋ·  阅读(58)  评论(0)    收藏  举报