• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

算法PHP实现经典排序算法一

php 搞代码 4年前 (2022-03-01) 16次浏览 已收录 0个评论
文章目录[隐藏]

一、冒泡排序

原理简介

冒泡排序(Bubble Sort)是一种简单常见的排序算法。它通过遍历需要排序的数列,比较两个数值的大小,将顺序错误的两个数交换位置,完成排序。重复上述操作,直到没有可交换的数为止,达到整个数列排序的目的。

代码示例

function bubbleSort(array $arr) : array
    {
        $len = count($arr);

        for ($i=0; $i<$len-1; $i++) {
            for ($j=0; $j< $len-1-$i;$j++) {
                if ($arr[$j] > $arr[$j+1]) {
                    $tmp = $arr[$j];
                    $arr[$j] = $arr[$j+1];
                    $arr[$j+1] = $tmp;
                }
            }
        }

        return $arr;
    }

二、选择排序

原理简介

首先在未排序的数列中找到最小元素,存放到排序序列的起始位置
再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
无论什么数列,使用选择排序,时间复杂度为O(n²)

代码实现

function selectionSort(array $arr) : array
    {
        $len = count($arr);

        for ($i = 0; $i < $len - 1; $i++) {
            $min_index = $i;
            for ($j = $i + 1; $j < $len; $j++) {
                if ($arr[$j] < $arr[$min_index]) {
                    $min_index = $j;
                }
            }
            $temp = $arr[$i];
            $arr[$i] = $arr[$min_index];
            $arr[$min_index] = $temp;
        }

        return $arr;
    }

三、插入排序

原理简介

插入排序类似于打斗地主时整理手牌顺序的操作,将未排序的数列从后往前,在已排序的数列中找到合适的位置插入,直到完成整个数列的排序。

代码示例

function insertSort(array $arr): array
    {
        $len = count($arr);

        for ($i = 1; $i < $len; $i++) {
            $pre_index = $i - 1;
            $current = $arr[$i];
            while ($pre_index >= 0 && $arr[$pre_index] > $current) {
                $arr[$pre_index + 1] = $arr[$pre_index];
                $pre_index--;
            }

            $arr[$pre_index + 1] = $current;
        }

        return $arr;
    }

四、希尔排序

原理简介

希尔排序,又称为递减增量排序算法,是基于插入排序的更快速的排序算法。希尔排序的思想是是数组中任意间隔为h的元素都是有序的。一个h有序数数组就是h个相互独立的有序数组编织在一起,组成的一个数组。在这些子数组中直接进行插入排序,

代码示例

function shellSort(array $arr): array
    {
        $len = count($arr);
        $tmp = 0;
        $gap = 1;
        while ($gap < $len / 3) {
            $gap = $gap * 3 + 1;
        }
        for (; $gap > 0; $gap = floor($gap / 3)) {
            for ($i = $gap; $i < $len; $i++) {
                $tmp = $arr[$i];
                for ($j = $i - $gap; $j >= 0 && $arr[$j] > $tmp; $j -= $gap) {
                    $arr[$j+$gap] = $arr[$j];
                }
                $arr[$j+$gap] = $tmp;
            }
        }

        return $arr;
    }

五、归并排序

原理简介

归并排序,顾名思义就是将一个数组排序,可以先将它递归地分成两半分别排序,然后将结果归并起来。时间复杂度为 NlogN

代码示例

function mergeSort(array $arr, $len = null): array
    {
        if ($len === null) {
            $len = count($arr);
        }

        if ($len <= 1) {
            return $arr;
        }

        //if len > 1 ,need cut into 2 part
        $mid = intdiv($len, 2); //php7中可用, 其他版本 使用intval($len/2)

        $left = array_slice($arr, 0, $mid);
        $right = array_slice($arr, $mid);

        $left = $this->mergeSort($left);
        $right = $this->mergeSort($right);

        $len_left = count($left);
        $len_right = count($right);
        $i = 0;
        $j = 0;
        $result = [];

        while ($i < $len_left || $j < $len_right) {
            if ($j == $len_right || ($left[$i] <= $right[$j] && $i < $len_left)) {
                $result[] = $left[$i];
                ++$i;
                continue;
            }

            if ($i == $len_left || $left[$i] > $right[$j]) {
                $result[] = $right[$j];
                ++$j;
                continue;
            }
        }

        return $result;
   }

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:算法PHP实现经典排序算法一
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址