python随想pythonでのソート問題(選択、泡立ち)

1860 ワード

pythonの中の循環のネストについて今少し前菜を食べて、小さい星を印刷します
#            
for i in range(1, 11):
    # print('*' * i)
    #             
    for j in range(i):
        print('*', end=' ')
    print()

リストソート実装、バブルソート法の考え方(昇順ソート)
lt = [8, 3, 6, 9, 5, 2, 4, 1, 7]
   :[3, 6, 8, 5, 4, 1, 7, 9]
   :[3, 6, 5, 4, 1, 7, 8, 9]
   :[3, 5, 4, 1, 6, 7, 8, 9]

三輪の比較でバブルソートの思想がわかるはず
バブルソートは実は2つのペア、すなわち1つ目と2つ目の比、2つ目と3つ目の比...前の比が後ろの比より大きいと位置を交換します.これで一番大きな数が一番後ろになり、二番目の数、三番目の数が一番前になります...参考例を書いてみましょう
#     :    
lt = [8, 3, 6, 9, 5, 2, 4, 1, 7]
n = len(lt)
#            
for i in range(n-1):
    #                
    for j in range(n-1-i):
        if lt[j] > lt[j+1]:
            #         
            # temp = lt[j]
            # lt[j] = lt[j+1]
            # lt[j+1] = temp
            # python     
            lt[j], lt[j+1] = lt[j+1], lt[j]

print(lt)

コードの解析について:1.最初のforサイクルは何ラウンドを制御して、最大の最後のラウンドの時は実はすべて並べ替えが終わって、これ以上並ぶ必要はありませんので、len(lt)-1回だけ並ぶ必要があります.2.第2のforサイクルは隣接する2つの要素の比較を制御し、外層はlen(lt)-1回を対比し、第2回の時に最後の経は最大であるため、第2回はlen(lt)-1-1回を対比するだけで、同理第3回はlen(lt)-1-2回...3である.次に、コントラスト回数を制御するjサイクルを比較する.前が後より大きい場合は交差し、最後のソート完了までのリストを渡すが、演算が複雑で、時間の複雑さが高い.
ソートの考え方を選択:まず1つの位置を取り出し、その位置の要素で後ろのすべての要素と比較し、適切でない場合は交換します.
  :lt = [8, 3, 6, 9, 5, 2, 4, 1, 7]
	   :1, 8, 6, 9, 5, 3, 4, 2, 7
	   :1, 2, 8, 9, 6, 5, 4, 3, 7
	   :1, 2, 3, 9, 8, 6, 5, 4, 7

选択顺位の考え方:选択顺位は1番目の数を决めて、この数で残りの各数と比较して、大きいのは后ろに置いて、一回下に向かって比较して、このように最后に最小の数を得て1番目の位置に置いて、第2ラウンドは2番目に决めて、残りと更に比较して...最后に最大のは最后に置いて、顺位は完成します
lt = [8, 3, 6, 9, 5, 2, 4, 1, 7]
n = len(lt)
for i in range(n-1):
    index = i
    for j in range(i+1,n-1):
        if lt[index] > lt[1+j]:
            index = j+1
            lt[i], lt[index] = lt[index], lt[i]
print(lt)