1、冒泡排序
原理簡介
冒泡排序(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;
}
2、選擇排序
原理簡介
首先在未排序的數列中找到最小元素,存放到排序序列的起始位置
再從剩餘未排序元素中繼續尋找最小元素,而後放到已排序序列的末尾。
重複第二步,直到全部元素均排序完畢。
不管什麼數列,使用選擇排序,時間複雜度爲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;
}
3、插入排序
原理簡介
插入排序相似於打鬥地主時整理手牌順序的操做,將未排序的數列從後往前,在已排序的數列中找到合適的位置插入,直到完成整個數列的排序。
代碼示例
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;
}
4、希爾排序
原理簡介
希爾排序,又稱爲遞減增量排序算法,是基於插入排序的更快速的排序算法。希爾排序的思想是是數組中任意間隔爲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;
}
5、歸併排序
原理簡介
歸併排序,顧名思義就是將一個數組排序,能夠先將它遞歸地分紅兩半分別排序,而後將結果歸併起來。時間複雜度爲
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;
}