1. 程式人生 > >修煉內功---資料結構與演算法8---氣泡排序

修煉內功---資料結構與演算法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),看起來效能並不是很好,所以在實踐中基本不會選用冒泡演算法。