修炼内功---数据结构与算法8---冒泡排序

在选择排序算法的时候,通常会根据以下几个维度来考虑:

1、时间复杂度
2、空间复杂度(对内存空间的消耗)
3、算法的稳定性(如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变)


冒泡排序只会操作相邻的两个数据。
每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足就让它俩互换。
一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。

<?php

/**
 * 冒泡排序实现函数(PHP)
 * @param $nums
 * @return mixed
 */
function bubble_sort($nums)
{
    if (count($nums) <= 1) {
        return $nums;
    }

    for ($i = 0; $i < count($nums); $i++) {
        //$flag考虑到了最优时间复杂度的情况
        $flag = false;
        for ($j = 0; $j < count($nums) - $i - 1; $j++) {
            if ($nums[$j] > $nums[$j + 1]) {
                $temp         = $nums[$j];
                $nums[$j]     = $nums[$j + 1];
                $nums[$j + 1] = $temp;
                $flag         = true;
            }
        }
        if (!$flag) {
            break;
        }
    }

    return $nums;
}

$nums = [4, 5, 6, 3, 2, 1];
$nums = bubble_sort($nums);
print_r($nums);

可以看到我们对冒泡排序有个小小的优化,就是当某一次遍历的时候发现没有需要交换的元素,则认为整个序列已经排序完成。

最后我们来看下冒泡排序的性能和稳定性:
1、时间复杂度: O(n^2) (n的平方)
2、空间复杂度:只涉及相邻元素的交换,是原地排序算法
3、算法稳定性:元素相等不会交换,是稳定的排序算法

时间复杂度是 O(n^2),看起来性能并不是很好,所以在实践中基本不会选用冒泡算法。

猜你喜欢

转载自blog.csdn.net/Dote2r/article/details/85197951