选择排序&冒泡排序

选择排序和冒泡排序时间复杂度都属于 O(n^2)级别的排序算法,由于它实现起来比较简单,在不考虑性能的简单情景下,可以优先考虑。

1.选择排序原理图

选择排序的原理就是每循环一次就挑出最小的那个(假设从小到大排),然后记住最小位置的那个索引,把它安排到最前面去,已经排过的位置就往后排,以此类推达到选择排序的目的:
在这里插入图片描述

2.选择排序代码

<?php
/**
 * 从小到大选择排序
 * @param array $arr
 * @return array
 */
function selectionSort(array $arr):array
{
    for ($i=0;$i < count($arr) - 1;$i++){
        $minIndex = $i;
        $min = $arr[$i];
        for ($j = $i;$j < count($arr);$j++){
            if($arr[$j] < $min){
                $minIndex = $j;
                $min = $arr[$j];
            }
        }
        if($minIndex != $i){
            $tpm = $arr[$minIndex];
            $arr[$minIndex] = $arr[$i];
            $arr[$i] = $tpm;
        }
    }

    return $arr;
}

$arr = [1,16,5,8,4,6,2,9,6,4,10,11,5,7,3,6,12];

print_r(selectionSort($arr));
/**
 * [1,2,3,4,4,5,5,6,6,6,7,8,9,10,11,12,16]
 */

演示输出如下图所示:
在这里插入图片描述

Tips:时间复杂度是 O(n^2) 级别的。

3.冒泡排序原理图

冒泡排序的原理就是每次循环过程中,直接比较当前位置和下一个位置的值比较,若当前位置值比下一个位置值大则交换位置(假设从小到大排序,向右冒泡),这样经过 n-1 次(n是元素个数)操作之后,就可以像冒泡一样达到排序的效果。
在这里插入图片描述

4.冒泡排序代码

<?php
/**
 * 冒泡排序从小到大
 * @param array $arr
 * @return array
 */
function bubblingSort(array $arr): array
{
    for($i=0;$i < count($arr) - 1;$i++){
        for ($j = 0;$j < count($arr) - 2 - $i;$j++){
            if($arr[$j] > $arr[$j+1]){
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $tmp;
            }
        }
    }
    return $arr;
}

$arr = [1,16,5,8,4,6,2,9,6,4,10,11,5,7,3,6,12];

print_r(bubblingSort($arr));
/**
 * [1,2,3,4,4,5,5,6,6,6,7,8,9,10,11,12,16]
 */

演示输出如下图:
在这里插入图片描述

Tips:时间复杂度是 O(n^2) 级别的。

代码仓库 :https://gitee.com/love-for-poetry/data-structure

扫码关注爱因诗贤
在这里插入图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐