banner
if

if

unless a kernel of wheat falls to the ground and dies, it remains only a seed; but if it dies, it bears much fruit.

冒泡ソートと選択ソート、安定と非安定

冒泡ソートと選択ソートの違い#

冒泡ソートの基本的なアイデアは、ソートされていないシーケンスから隣接する 2 つの要素を順番に比較し、順序が正しくない場合は交換することです。複数の反復を通じて、最大(または最小)の要素を徐々にシーケンスの末尾に移動し、シーケンス全体が整列するまで続けます。

image


選択ソートの基本的なアイデアは、ソートされていないシーケンスから最小(または最大)の要素を選択し、シーケンスの最初の要素と交換し、残りの未ソート部分から最小(または最大)の要素を選択し、シーケンスの 2 番目の要素と交換することを繰り返し行い、シーケンス全体が整列するまで続けます。

image


まとめると、冒泡ソートは隣接する要素を比較して交換することで最大(または最小)の要素を徐々に移動させますが、選択ソートは最小(または最大)の要素を選択して交換することで整列されたシーケンスを構築します。交換には時間がかかるため、選択ソートの平均パフォーマンスは冒泡ソートよりも優れていますが、実際のアプリケーションでは、ソートされるシーケンスがほぼ整列されている場合、冒泡ソートの方が選択ソートよりも速い場合があります。

選択ソートと冒泡ソートの時間複雑度と安定性#

冒泡ソート(Bubble Sort)
時間複雑度:最良の場合 O (n)、平均および最悪の場合 O (n^2)。
空間複雑度:O (1)。
安定性:安定したソートアルゴリズムです。隣接する要素の交換では、交換する要素の相対的な順序が異なる場合にのみ交換が行われます。

選択ソート(Selection Sort):

時間複雑度:最良、平均、最悪の場合でも O (n^2) です。
空間複雑度:O (1)。
安定性:選択ソートは安定ではありません。最小(または最大)の要素を選択する過程で、同じ要素の相対的な順序が破壊される可能性があります。

以上から、冒泡ソートは安定したソートアルゴリズムであり、選択ソートは安定していないソートアルゴリズムです。選択ソートでは、各ラウンドで最小(または最大)の要素を選択する過程で、同じ要素の相対的な順序が変わる可能性があります。したがって、同じ要素の相対的な順序を保持する必要がある場合、選択ソートは適用されず、冒泡ソートは同じ要素の相対的な順序を保持することができます。

Python のコード例による安定性と非安定性の違いの説明、冒泡ソートと選択ソートを使用してソートする#

まず、名前とスコアの属性を持つ Student クラスを定義します:

python
class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def __str__(self):
        return f"{self.name}: {self.score}"

次に、学生の配列を作成し、スコアは同じですが名前が異なる 2 つの学生オブジェクトを含めます:

students = [
    Student("Tom", 80),
    Student("Alice", 90),
    Student("Bob", 80),
    Student("Jack", 70),
    Student("David", 80)
]

そして、冒泡ソートと選択ソートを使用して学生の配列をスコアでソートします:

冒泡ソート

def bubble_sort(students):
    n = len(students)
    for i in range(n - 1):
        for j in range(n - 1 - i):
            if students[j].score > students[j + 1].score:
                students[j], students[j + 1] = students[j + 1], students[j]

bubble_sort(students)

選択ソート

def selection_sort(students):
    n = len(students)
    for i in range(n - 1):
        min_index = i
        for j in range(i + 1, n):
            if students[j].score < students[min_index].score:
                min_index = j
        students[i], students[min_index] = students[min_index], students[i]

selection_sort(students)

最後に、ソートされた学生の配列を反復処理してソート結果を出力します:

for student in students:
    print(student)

安定なソートアルゴリズム、例えば冒泡ソートを使用する場合、上記のコードを実行した後の出力は次のようになる可能性があります:

Jack: 70
Tom: 80
Bob: 80
David: 80
Alice: 90

同じスコアの学生オブジェクトの相対的な順序がソート後も保持されていることがわかります。

一方、非安定なソートアルゴリズム、例えば選択ソートを使用する場合、上記のコードを実行した後の出力は次のようになる可能性があります:

Jack: 70
Bob: 80
David: 80
Tom: 80
Alice: 90

同じスコアの学生オブジェクトの相対的な順序が選択ソートによって変更されていることがわかります。

同じスコアの要素の間に関連性や並べ替えのルールがある場合、それらの順序を変更することは関連性の喪失を引き起こす可能性があります。

したがって、ソートアルゴリズムの「非安定性」とは、同じ要素のソート前後の相対的な順序が変わる可能性を指します。

冒泡ソートはソート後に同じ要素の相対位置を変更しないため、安定したソートアルゴリズムです。一方、選択ソートは非安定なソートアルゴリズムです。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。