每种语言几乎都内置了排序的函数或者方法,很多时候并不需要自己手动书写一些排序算法,因此对于排序算法如何实现都是一知半解,知其然不知其所以然,很多时候看似相同,例如排序算法基本就是比较,交换,但是其中的如何比较,何时交换原理是不同的。
以下代码实现均为PHP
以下动图均来自这位博主的文章
插入排序
实现思路:从第二个元素开始往前比较,如果符合条件,则交换位置
代码实现
function insert_sort($arr)
{
$num = count($arr);
for ($i = 1; $i < $num; $i++) {
for ($j = $i-1; $j >= 0; $j--) {
if ($arr[$j+1] < $arr[$j]) {
$tmp = $arr[$j+1];
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
}else{
break;
}
}
}
return $arr;
}
冒泡排序
实现思路:重复走访要排序的元素列,依次比较两个相邻的元素,如果符合条件,则交换位置
代码实现
function bubble_sort($arr)
{
$num = count($arr);
for ($i = 0; $i< $num-1; $i++) {
for ($j = 1; $j < $num-$i; $j++) {
if ($arr[$j] < $arr[$j-1]) {
$tmp = $arr[$j-1];
$arr[$j-1] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
return $arr;
}
选择排序
实现思路:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾
代码实现
function select_sort($arr)
{
$num = count($arr);
for ($i = 0; $i< $num-1; $i++) {
$index = $i;
for ($j = $i+1; $j < $num; $j++) {
if ($arr[$index] > $arr[$j]) {
$index = $j;
}
}
$tmp = $arr[$i];
$arr[$i] = $arr[$index];
$arr[$index] = $tmp;
}
return $arr;
}
快速排序
实现思路:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
代码实现
function quick_sort($arr)
{
$num = count($arr);
if ($num <= 1) {
return $arr;
}
$left_arr = [];
$right_arr = [];
$middle = $arr[0];
for ($i = 1; $i < $num; $i++) {
if ($arr[$i] > $middle) {
$right_arr[] = $arr[$i];
} else {
$left_arr[] = $arr[$i];
}
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, [$middle], $right_arr);
}