php实现八中排序算法

来源:互联网 发布:java split截取|| 编辑:程序博客网 时间:2024/05/01 18:44

Open Source: https://github.com/frowhy/Algorithm
Packagist: https://packagist.org/packages/frowhy/algorithm
涵盖了八大排序算法,欢迎优化补充。

  • 快速排序
  • 冒泡排序
  • 直接选择排序
  • 插值排序
  • 希尔排序
  • 归并排序
  • 计算排序
  • 堆排序
<?php/** * Created by PhpStorm. * User: frowhy * Date: 2017/4/4 * Time: 04:14 * *_______________%%%%%%%%%_______________________ *______________%%%%%%%%%%%%_____________________ *______________%%%%%%%%%%%%%____________________ *_____________%%__%%%%%%%%%%%___________________ *____________%%%__%%%%%%_%%%%%__________________ *____________%%%_%%%%%%%___%%%%_________________ *___________%%%__%%%%%%%%%%_%%%%________________ *__________%%%%__%%%%%%%%%%%_%%%%_______________ *________%%%%%___%%%%%%%%%%%__%%%%%_____________ *_______%%%%%%___%%%_%%%%%%%%___%%%%%___________ *_______%%%%%___%%%___%%%%%%%%___%%%%%%_________ *______%%%%%%___%%%__%%%%%%%%%%%___%%%%%%_______ *_____%%%%%%___%%%%_%%%%%%%%%%%%%%__%%%%%%______ *____%%%%%%%__%%%%%%%%%%%%%%%%%%%%%_%%%%%%%_____ *____%%%%%%%__%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%____ *___%%%%%%%__%%%%%%_%%%%%%%%%%%%%%%%%_%%%%%%%___ *___%%%%%%%__%%%%%%_%%%%%%_%%%%%%%%%___%%%%%%___ *___%%%%%%%____%%__%%%%%%___%%%%%%_____%%%%%%___ *___%%%%%%%________%%%%%%____%%%%%_____%%%%%____ *____%%%%%%________%%%%%_____%%%%%_____%%%%_____ *_____%%%%%________%%%%______%%%%%_____%%%______ *______%%%%%______;%%%________%%%______%________ *________%%_______%%%%________%%%%______________ */namespace Frowhy\Algorithm;class Algorithm{    public static function quickSort($arr) {        if (! is_array($arr)) {            return false;        }        $len = count($arr);        if ($len <= 1) {            return $arr;        }        $left = $right = [];        for ($i = 1; $i < $len; $i++) {            if ($arr[$i] < $arr[0]) {                $left[] = $arr[$i];            } else {                $right[] = $arr[$i];            }        }        $left  = self::quickSort($left);        $right = self::quickSort($right);        return array_merge($left, [$arr[0]], $right);    }    static function array_swap($arr, $l, $r) {        $arr[$l] = $arr[$l] ^ $arr[$r];        $arr[$r] = $arr[$l] ^ $arr[$r];        $arr[$l] = $arr[$l] ^ $arr[$r];        return $arr;    }    public static function bubbleSort($arr) {        if (! is_array($arr)) {            return false;        }        $len = count($arr);        if ($len <= 1) {            return $arr;        }        for ($i = 1; $i < $len; $i++) {            $max_j = $len - $i;            for ($j = 0; $j < $max_j; $j++) {                if ($arr[$j] > $arr[$j + 1]) {                    $arr = self::array_swap($arr, $j, $j + 1);                }            }        }        return $arr;    }    public static function selectionSort($arr) {        if (! is_array($arr)) {            return false;        }        $len = count($arr);        if ($len <= 1) {            return $arr;        }        for ($i = 0; $i < $len; $i++) {            $min_i = $arr[$i];            $index = $i;            $min_j = $i + 1;            for ($j = $min_j; $j < $len; $j++) {                if ($arr[$j] < $min_i) {                    $min_i = $arr[$j];                    $index = $j;                }            }            if ($i < $index) {                $arr = self::array_swap($arr, $i, $index);            }        }        return $arr;    }    public static function insertionSort($arr) {        if (! is_array($arr)) {            return false;        }        $len = count($arr);        if ($len <= 1) {            return $arr;        }        for ($i = 0; $i < $len; $i++) {            $pre_i   = $i - 1;            $current = $arr[$i];            while ($pre_i >= 0 && $arr[$pre_i] > $current) {                $arr[$pre_i + 1] = $arr[$pre_i];                $pre_i -= 1;            }            $arr[$pre_i + 1] = $current;        }        return $arr;    }    public static function shellSort($arr) {        if (! is_array($arr)) {            return false;        }        $len = count($arr);        if ($len <= 1) {            return $arr;        }        $gap   = 1;        $pre_i = $len / 3;        while ($gap < $pre_i) {            $gap = $gap * 3 + 1;        }        while ($gap > 0) {            for ($i = 0; $i < $len; $i++) {                $temp = $arr[$i];                $j    = $i - $gap;                while ($j >= 0 and $arr[$j] > $temp) {                    $arr[$j + $gap] = $arr[$j];                    $j -= $gap;                }                $arr[$j + $gap] = $temp;            }            $gap = floor($gap / 3);        }        return $arr;    }    public static function mergeSort(&$arr) {        if (! is_array($arr)) {            return false;        }        $len = count($arr);        if ($len <= 1) {            return $arr;        }        $mid   = $len >> 1;        $left  = array_slice($arr, 0, $mid);        $right = array_slice($arr, $mid);        static::mergeSort($left);        static::mergeSort($right);        if (end($left) <= $right[0]) {            $arr = array_merge($left, $right);        } else {            for ($i = 0, $j = 0, $k = 0; $k <= $len - 1; $k++) {                if ($i >= $mid && $j < $len - $mid) {                    $arr[$k] = $right[$j++];                } elseif ($j >= $len - $mid && $i < $mid) {                    $arr[$k] = $left[$i++];                } elseif ($left[$i] <= $right[$j]) {                    $arr[$k] = $left[$i++];                } else {                    $arr[$k] = $right[$j++];                }            }        }        return $arr;    }    public static function countingSort($arr) {        if (! is_array($arr)) {            return false;        }        $len = count($arr);        if ($len <= 1) {            return $arr;        }        $count = $sorted = [];        $min   = min($arr);        $max   = max($arr);        for ($i = 0; $i < $len; $i++) {            $count[$arr[$i]] = isset($count[$arr[$i]]) ? $count[$arr[$i]] + 1 : 1;        }        for ($j = $min; $j <= $max; $j++) {            while (isset($count[$j]) && $count[$j] > 0) {                $sorted[] = $j;                $count[$j]--;            }        }        return $sorted;    }    public static function heapSort($arr) {        if (! is_array($arr)) {            return false;        }        global $len;        $len = count($arr);        if ($len <= 1) {            return $arr;        }        for ($i = $len; $i >= 0; $i--) {            self::heapify($arr, $i);        }        return $arr;    }    static function heapify($arr, $i) {        $left    = 2 * $i + 1;        $right   = 2 * $i + 2;        $largest = $i;        global $len;        if ($left < $len && $arr[$left] > $arr[$largest]) {            $largest = $left;        }        if ($right < $len && $arr[$right] > $arr[$largest]) {            $largest = $right;        }        if ($largest != $i) {            self::array_swap($arr, $i, $largest);            self::heapify($arr, $largest);        }    }}
<?php/** * Created by PhpStorm. * User: frowhy * Date: 2017/4/4 * Time: 04:22 * *_______________%%%%%%%%%_______________________ *______________%%%%%%%%%%%%_____________________ *______________%%%%%%%%%%%%%____________________ *_____________%%__%%%%%%%%%%%___________________ *____________%%%__%%%%%%_%%%%%__________________ *____________%%%_%%%%%%%___%%%%_________________ *___________%%%__%%%%%%%%%%_%%%%________________ *__________%%%%__%%%%%%%%%%%_%%%%_______________ *________%%%%%___%%%%%%%%%%%__%%%%%_____________ *_______%%%%%%___%%%_%%%%%%%%___%%%%%___________ *_______%%%%%___%%%___%%%%%%%%___%%%%%%_________ *______%%%%%%___%%%__%%%%%%%%%%%___%%%%%%_______ *_____%%%%%%___%%%%_%%%%%%%%%%%%%%__%%%%%%______ *____%%%%%%%__%%%%%%%%%%%%%%%%%%%%%_%%%%%%%_____ *____%%%%%%%__%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%____ *___%%%%%%%__%%%%%%_%%%%%%%%%%%%%%%%%_%%%%%%%___ *___%%%%%%%__%%%%%%_%%%%%%_%%%%%%%%%___%%%%%%___ *___%%%%%%%____%%__%%%%%%___%%%%%%_____%%%%%%___ *___%%%%%%%________%%%%%%____%%%%%_____%%%%%____ *____%%%%%%________%%%%%_____%%%%%_____%%%%_____ *_____%%%%%________%%%%______%%%%%_____%%%______ *______%%%%%______;%%%________%%%______%________ *________%%_______%%%%________%%%%______________ */use Frowhy\Algorithm\Algorithm;require_once __DIR__ . '/vendor/autoload.php';$total = 20;$arr   = [];for ($i = 0; $i < $total; $i++) {    $arr[] = rand(-10000, 10000);}$quickSort     = Algorithm::quickSort($arr);$bubbleSort    = Algorithm::bubbleSort($arr);$selectionSort = Algorithm::selectionSort($arr);$insertionSort = Algorithm::insertionSort($arr);$shellSort     = Algorithm::shellSort($arr);$mergeSort     = Algorithm::mergeSort($arr);$countingSort  = Algorithm::countingSort($arr);$heapSort      = Algorithm::heapSort($arr);print_r([            '原数组'  => $arr,            '快速排序' => $quickSort,            '冒泡排序' => $bubbleSort,            '选择排序' => $selectionSort,            '插值排序' => $insertionSort,            '希尔排序' => $shellSort,            '归并排序' => $mergeSort,            '计算排序' => $countingSort,            '堆排序'  => $heapSort,        ]);