Pythonの選択ソート時間の複雑さ

選択ソート、クイックソート、ヒルソート、ヒープソートは安定したソートアルゴリズムではありませんが、
バブルソート、挿入ソート、マージソート、およびラジカルソートは安定したソートアルゴリズムです。
不安定なソートアルゴリズムの意味は、ソート前には等しい2つの数値があるということですが、ソート後、2つは順序を変更する可能性があります。

1はじめに

整数のシーケンスが与えられた場合、整数を昇順(具体的には非降順)に並べます。

選択ソートのアイデア:最小のものを選択して最初の位置を交換し、2番目
に小さいものを選択して2番目の位置を交換します...最小のものがN番目とN-1番目の要素から選択されて最初のNに配置されるまで-1ポジション。

2選択ソート表記1

def select_sort(li):
    li_new = []
    for i in range(len(li)):
        # 选出数组li中的最小值
        min_val = min(li)
        print("i %d %d" % (i, min_val))
        # 向临时数组中添加最小元素
        li_new.append(min_val)
        # 移除原数组中的最小元素
        li.remove(min_val)
        
        print(li)

    return li_new

埋め込む


li = [3, 2, 4, 7, 1, 2]
# 排序前
print(li)
print("-----------")
# 执行排序
netList = select_sort(li)
print("-----------")
# 排序后
print(netList)

ここに画像の説明を挿入

3選択ソートの書き方2

def select_sort2(li):
    for i in range(len(li) - 1):
        # 记录最小值的角标
        min_index = i
        for j in range(i + 1, len(li)):
            # 如果当前值小于 min_index 角标下的值 
            if li[j] < li[min_index]:
                # 就进行值替换 目的是将最小的值放在最左侧
                li[i], li[min_index] = li[min_index], li[i]
                print(li)

埋め込む

li = [3, 2, 4, 7, 1, 2]
# 排序前
print(li)
print("-----------")
# 执行排序
select_sort2(li)
print("-----------")
# 排序后
print(li)

の結果
ここに画像の説明を挿入

4時間計算量

最初の内部ループはN-1回、次にN-2回、N-3回、...を比較し、最後の内部ループは1回比較します。
比較の総数は(N-1)+(N-2)+…+ 1であり、等差数列の合計が得られて(N-1 + 1)* N / 2 = N ^2/2が得られます。
最高の項係数を破棄する時間計算量はO(N ^ 2)です。

選択ソートとバブルソートの時間計算量は同じですが、実際には、選択ソートはほとんどスワップ操作を実行せず、最大でN-1個のスワップが発生します。
バブルソートの最悪の場合、N^2/2スワップ操作が発生します。この意味で、スワップソートのパフォーマンスはバブルソートよりもわずかに優れています。さらに、スワップソートはバブルソートのアイデアよりも直感的です。

おすすめ

転載: blog.csdn.net/zl18603543572/article/details/122330462