文章简介
本文针对插入、选择、冒泡、归并、希尔和快速排序六大算法进行演示,主要分析算法过程的具体实现与实际demo,demo采用PHP编程语言实现。文末介绍算法过程分析工具。由于一篇公众号只能插入三个视频,因此快速排序和归并排序的视频,是通过回复关键字才可以查看(表示很无奈)。快速排序直接发送选择、归并直接发送归并。
算法分析:在一组需要排序的数列中,假设前面的数据是已经排好序,将后面需要排序的数与前面已经排好序的数据从后往前依次进行比较,使其插入到排好序的序列中。按照此种方式依次循环。最终得到的就是排好序的数列。
算法步骤
代码示例
function insertSort($arr) {
$len=count($arr);
if ($len < 2) {
return $arr;
}
for($i=1, $i<$len; $i++)
$tmp = $arr[$i];
for($j=$i-1;$j>=0;$j--) {
if($tmp < $arr[$j]) {
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
} else {
break;
}
}
}
return $arr;
}
算法分析:在一组需要排序的数列中,将前后相邻的一对数进行比较,如果发现两者数据大小不同,则相互交换位置,让大的数据往后移,直到第一轮对比完成,此时再重头开始按照相同的方式进行排序。
算法步骤
代码示例
function bubbleSort($arr)
{
$len=count($arr);
if ($len < 2) {
return $arr;
}
for($i=1;$i<$len;$i++)
{
for($k=0;$k<$len-$i;$k++)
{
if($arr[$k]>$arr[$k+1])
{
$tmp=$arr[$k+1];
$arr[$k+1]=$arr[$k];
$arr[$k]=$tmp;
}
}
}
return $arr;
}
算法分析:在一组需要排序的数列中,选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
算法步骤
代码示例
function quickSort($arr) {
$len = count($arr);
if ($len < 2) {
return $arr;
}
$base_num = $arr[0];
$left_array = array();
$right_array = array();
for($i=1; $i<$len; $i++) {
if($base_num > $arr[$i]) {
$left_array[] = $arr[$i];
} else {
$right_array[] = $arr[$i];
}
}
$left_array = quickSort($left_array);
$right_array = quickSort($right_array);
return array_merge($left_array, array($base_num), $right_array);
}
算法分析:在一组需要排序的数列中,选出数列中最小的数与第一个数进行交换位置,接着再从剩下的数中选择一个最小的数与第二个位置进行交换位置。依次往复,直到第n个数为止。
算法步骤
代码示例
function selectSort($arr) {
$len=count($arr);
if ($len < 2) {
return $arr;
}
for($i=0; $i<$len-1; $i++) {
$p = $i;
for($j=$i+1; $j<$len; $j++) {
if($arr[$p] > $arr[$j]) {
$p = $j;
}
}
if($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
return $arr;
}
算法分析:在一组需要排序的数列中,将数列分为多个小的数列,先对小的数列进行排序,然后再合并这些已经排好序的小数列。
算法步骤
代码示例
function merge_sort($arr)
{
$len = count($arr);
if ($len < 2) {
return $arr;
}
$left = merge_sort(array_slice($arr, 0, floor($len / 2)));
$right = merge_sort(array_slice($arr, floor($len / 2)));
$newArr = merge($left, $right);
return $newArr;
}
function merge($left, $right)
{
$arr = [];
$i = $j = 0;
while ($i < count($left) && $j < count($right)) {
if ($left[$i] < $right[$j]) {
$arr[] = $left[$i];
$i++;
} else {
$arr[] = $right[$j];
$j++;
}
}
$arr = array_merge($arr, array_slice($left, $i));
$arr = array_merge($arr, array_slice($right, $j));
return $arr;
}