一、冒泡排序
原理简介
冒泡排序(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; }