新しいアルゴリズム科目をテストするために必要な孟:バブルソート

バブルソートアルゴリズムプログラマのエントリの1我々は、従来のバブルソートアルゴリズムを見て、それを必要とする必要があります。

DEF bubble_sort_01(random_list):
     "" " 最適化されていない従来のバブルソート" "" 
    list_len = LEN(random_list)
    外部制御ループの数、内部制御インデックス
    のため outer_idx における範囲(list_len - 1。 のために inner_idx における範囲(list_len - 1 - 。outer_idx):
             IF random_list [inner_idx]> random_list [inner_idx + 1 ]:
                random_list [inner_idx]、random_list [inner_idx + 1] = random_list [inner_idx + 1 ]、random_list [inner_idx]

 

最適化:

プロセスが不要であり、時間と空間の無駄の後ろに時々発生するランダムリスト要素の配置はそれほど排出された、事前にリストを知るためにどのような方法があり、後のn-1回前にすでにソートそう混沌ではありませんため、それは良いですか?答えはもちろんである、我々は何のデータ交換を持っていない、ソート処理の内側にマーカーを追加循環の現在のラウンドを表示することができ、ダウンサイクルあれば、何のデータ交換が行われていないがあり、そのリストには注文した後、されています次回実現するために来て、

DEF bubble_sort_02(random_list):
     "" " 終了フラグのバブルソートを追加" "" 
    list_len = LEN(random_list)
    外部制御ループの数、内部制御インデックス
    のため outer_idx における範囲(list_len - 1 ):
        追加Aフラグ 
        フラグ=で0
         ため inner_idx における範囲は、(list_len - 1 - 。outer_idx):
             IF random_list [inner_idx]> random_list [inner_idx + 1 ]:
                random_list [inner_idx]、random_list [inner_idx + 1] = random_list [inner_idx + 1 ]、random_list [ inner_idx] = 1 +
         フラグが0である場合は、各サイクルの後、それが決定され、それは一種の終わりに導くように、データ交換が発生していないことを示して
        IFフラグ== 0:
             BREAK

 

最適化するには続行:

第二の方法は、実際にはその後、内側のループの多くはあまり実行し、改善の余地それが内部ループということだろう、外側のループの早期終了を可能に外側のループ用に最適化されていますか?その答えは、その後最終的に達成する方法を確認するために、最初の2つの方法は、バックから内部ループは、順方向トラバースを追加する場合は、前面から背面に横断次いで外層とサイクル数は半分に低減することができるされ、イエスです。

DEF bubble_sort_03(random_list):
     "" " バブルソート双方向末端標識を追加" "" 
    list_len = LEN(random_list)
    外部制御サイクル、内部制御インデックス
    のため outer_idx における範囲(list_len - 1 ):
        追加フラグ 
        フラグ=で0
         ため inner_idx における(list_len outer_idx、 - 1 -レンジouter_idx):
             IF random_list [inner_idx]> random_list [inner_idx + 1 ]:
                random_list [inner_idx]、random_list [inner_idx。+ 1] = random_list [inner_idx + 1 ] 、random_list [inner_idx] 
                フラグで = 1 +
        各サイクル後には、フラグが0である場合、データ交換は、ソート終了する直接発生していない判断された
        IFフラグ== 0
             BREAKの
        #が逆選別サイクルを追加
        するための I における - 2 - outer_idx、レンジ(list_len outer_idx、-1 ):
             IF random_list [I] <random_list [I - 1 ]:
                random_list [I]、random_list [I - 1] = random_list [I - 1]、random_list [I]

 

3つの方法のサイクル数の合計を表示する整数ランダムに生成されたリスト100の長さは、結果は次のとおりです。

おすすめ

転載: www.cnblogs.com/suanmiaoup/p/12188330.html