選択ソート、クイックソート、ヒルソート、ヒープソートは安定したソートアルゴリズムではありませんが、
バブルソート、挿入ソート、マージソート、およびラジカルソートは安定したソートアルゴリズムです。
不安定なソートアルゴリズムの意味は、ソート前には等しい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スワップ操作が発生します。この意味で、スワップソートのパフォーマンスはバブルソートよりもわずかに優れています。さらに、スワップソートはバブルソートのアイデアよりも直感的です。