php经典排序算法,【算法】PHP实现经典排序算法一

一、冒泡排序

原理简介

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

代码示例

function bubbleSort(array $arr) : array

{

$len = count($arr);

for ($i=0; $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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值