Pythonの古典的なソートアルゴリズム

https://www.cnblogs.com/onepixel/p/7674659.htmlこの記事は非常にいいです

https://www.bilibili.com/video/av685670?from=search&seid=1637373535603658338この素晴らしいアクションフィギュア

https://www.icourse163.org/course/ZJU-93001    MOOCデータ構造良く浙江大学、ホーミング・チン


バブルソート、選択ソート、挿入ソートこれら三つが最も遅いと最も古典的な3つのソートアルゴリズムであります

クイックソート大きなランダムシリアル番号のため、一般的に知られている最速のソートであると考えられています

バブルソートバブルソート

最も単純なソートアルゴリズムでなく、最悪の効率、それは「為替操作」の多くを無駄に、最終的な位置に交換前の知らなければならないので、

リストがソートされている場合は、それが最良の場合で、横断中に何の交換は、ソートされていることが見つかった場合は、この修正でバブリング、早期に終了することはできないことが多いと呼ばれる短いバブルソート


時間複雑さ:平均はO(n ^ 2)最悪O(N ^ 2)は、好ましくは、O(N)であります

宇宙複雑:O(1)

安定しました

#テスト入力配列
連想リストを= [27、33は、ある28 ,. 4、2、26 14、35 ,. 8、13である] 

#バブルソート
範囲におけるIため(LEN(連想リスト)-1)
    の範囲でJ(LEN用(連想リスト)-1-I):
        IF連想リスト[J]>連想リスト[J + 1]:
            連想リスト[J]、連想リスト[J + 1] =連想リスト[J + 1]、連想リスト[J]が
        
#ソート出力結果
を印刷します( 'ソート:'、連想リスト)

選択ソート選択ソート

改善された選択ソートバブルソート、リストに一度だけ交換を通じて毎回


時間複雑さ:平均はO(n ^ 2)最悪O(N ^ 2)は、好ましくは、O(N ^ 2)であります

宇宙複雑:O(1)

不安定な

#テスト入力配列
連想リストを= [27、33は、ある28 ,. 4、2、26 14、35 ,. 8、13である] 

ソート選択#
範囲のiについて(LEN(連想リスト)-1):
    最小= I 
    の範囲内のjについて(I + 1、lenの(連想リスト)。):
        IF連想リスト[J] <連想リスト[最小]:
            最小= J 
    IF最少= I :! 
        連想リスト[最小]、連想リスト[I] =連想リスト[I]、連想リスト[最小] 

#ソート結果出力
プリント(「ソート:」、連想リスト )

挿入ソート挿入ソート

それは、常にリストの低い位置に維持されている子供がアイテムより大きなソートされたリストになりそうという、前のサブリストにサブリストの並べ替え、およびそれぞれの新しいアイテム「挿入」帰ってきました


時間複雑さ:平均はO(n ^ 2)最悪O(N ^ 2)は、好ましくは、O(N)であります

宇宙複雑:O(1)

安定しました

#テスト入力配列
連想リストを= [27、33は、ある28 ,. 4、2、26、35、。8、14 13である] 

#挿入ソート
範囲でIの場合:(1、(連想リスト)でlen。)
    J = I; 
    一方J> 0と連想リスト[J-1]>連想リスト[J]:
        連想リスト[J-1]、連想リスト[J] =連想リスト[J]、連想リスト[J-1] 
        。J - = 1 
        
#ソート結果出力
プリント(「ソート: 」、連想リスト)

シェルソートシェルソート

1959シェル発明、O(N ^ 2)は、最初のブレークをソートし、ソート、挿入ソート簡単な挿入を向上し、それは「増分降順ソート」として知られている優先度比較遠い要素、異なります

データ操作はほとんど、すなわち、線形順序の効率を達成することができる高効率を、ソートされたときに、挿入ソートは、データのみを移動させることができるので、一般的に非効率的である。図2に示すようにソート挿入を改善するために、次の機能を対象とします一つ

比較するすべての要素を介してシェルソート、挿入ソートの性能を改善するためにいくつかの領域に分割されています。これは1時間要素が最終位置に向けた大きな一歩前進することができことができます

ギャップの概念は、ギャップを減少させる、最後のステップは、挿入ソートであるが、この時間はほとんどソート

ヒルソートギャップのコアであります

既知のギャップを連続的に隙間のようにして得られた実施例分割シーケンスに従うことによって、[1、4、10、23、57、701、301、132] =、ギャップをマルチンCiuraのギャップ配列を提供するが、配列の長さは2


時間複雑さ:平均O(N(LOGN)^ 2)最悪O(N ^ 2)は、好ましくは、O(N)であります

宇宙複雑:O(1)

不安定な

#テスト入力アレイ
連想リスト= [27、33は、ある28 ,. 4、2、26 14、35 ,. 8、13である] 

#ヒルソーティング
ギャップ= lenの(連想リスト)2 // 
一方、ギャップ> 0:
    各ギャップのための位ソート挿入を行う
    範囲(GAP、lenの(連想リスト))でIの場合:
        J = I 
        一方J> = GAPと連想リスト[J-GAP]>連想リスト[J]:
            連想リスト[J-GAP]、連想リスト[J] =連想リスト[J]、連想リスト[GAP-J] 
            J - GAP =            
    GAP = GAP 2 // 

#ソート結果出力
プリント( 'ソート'、連想リスト )

マージソートマージソート

性能を改善するために分割統治戦略は、分割統治の典型的なアプリケーションであります

マージソートは再帰的なアルゴリズムで、リストは半分に分割されていきます

複数のマージをマージ

欠点は、マージプロセスは、余分な収納スペースを必要とすることです


時間複雑さ:平均O(nlogn)最悪O(nlogn)は、好ましくは、O(nlogn)

宇宙複雑:O(n)は、

安定しました

#测试输入数组
連想リスト= [27、33、28、4、2、26、13、35、8、14] 
归并排序
DEF merge_sort(のIList):    
    DEFマージ(左、右):
        結果= [] 
        間に左そして、右:
            result.append((左の場合は左[0] <=右の[0]他右)(0).pop)
        リターン結果+左+右を
    
    lenの場合(のIList)<= 1:
        戻りのIList 
    ミッド= LEN( IListの)// 2 
    リターンマージ(merge_sort(IListの[:ミッド])、merge_sort(IListの[半ば:])) 
排序结果输出
印刷( 'ソート:'、merge_sort(連想リスト))

クイックソートクイックソート

追加のストレージを使用することなく、分割統治法を用いて、同じ順序付けをマージ

バブルソートは改善されています

一般的に著しく速く、他のアルゴリズムよりも、その内部ループアーキテクチャの大部分に到達するのに非常に有効であることができるので

シンプルバージョンとマージソートだけでなく、追加のストレージスペースの必要性は、しかし、インプレースバージョンを変更することができ、余分なスペースはしません


時間複雑さ:平均O(nlogn)最悪O(N ^ 2)は、好ましくは、O(nlogn)であります

宇宙複雑:O(nlogn)

不安定な

#测试输入数组
連想リスト= [27、33、28、4、2、26、13、35、8、14] 
快速排序
DEF quick_sort(のIList):
    長さ= lenは(IListの)
    長さ<= 1の場合:
        戻りのIList 
    他:
        #最初に使用するピボットとして最後の要素
        ピボット= ilist.pop()
        より大きいリストにピボットより大きい#入れ要素
        より少ないリストにピボットよりも少ない要素を入れ#
        少ないほど、= []、[] 
        のIListの要素のために:
            もしエレメント>ピボット:
                greater.append(エレメント)
            他:
                lesser.append(要素)
        リターンquick_sort(少ない)+ [ピボット] + quick_sort(大きいです)

#ソート結果出力
プリント( 'ソート:'、quick_sort (連想リスト))

ヒープのソート・ヒープの並べ替え

一つのオプションは、ソート改善されています

このアルゴリズムは、設計されたヒープのデータ構造はほぼ完全なバイナリツリーを使用しています

一般的に実根小さなヒープ杭の大根次元アレイによるスタック、


時間複雑さ:平均O(nlogn)最悪O(nlogn)は、好ましくは、O(nlogn)

宇宙複雑:O(1)

不安定な

#测试输入数组
連想リスト= [27、33、28、4、2、26、13、35、8、14] 
堆排序
DEF heapify(ソートされていない、インデックス、HEAP_SIZE):
    最大=指数
    left_index = 2 *インデックス+ 1 
    right_index = 2 *インデックス+ 2 
    left_index <HEAP_SIZEとソートされていない[left_index]>ソートされていない[最大]の場合:
        最大= left_index 

    場合right_index <HEAP_SIZEとソートされていない[right_index]>ソートされていない[最大]:
        最大= right_index 

    !の場合、最大=インデックス:
        未ソート[最大]、ソートされていない[インデックス] =ソートされていない[インデックス]、ソートされていない[最大] 
        heapify(ソートされていない、最大、HEAP_SIZE)
        
DEF heap_sort(ソートされていない):
    N = LEN(ソートされていない) 
    の範囲(N // 2のiについて- 、1 -1、-1):
        (未分類I、N)heapify 
    の範囲内のiについて(N - 1、0、-1):
        ソートされていない[0]、未分類未分類、[i]は[I] =ソートされていない[0] 
        heapify(ソートされていない、0、I)
    ソートされていない返す

#を排序结果输出
印刷( 'ソート:'、heap_sort(連想リスト))

おすすめ

転載: www.cnblogs.com/yongestcat/p/12073317.html