2016-05-18 11 views
1

助けてください。バブルソートアルゴリズムを最適化する必要があります。これは、最適化されていないバブルソートよりも全体の比較を少なくするためです。私は「(唯一の左から右へ移動する)通常のバブルソート:Python 3:最適化されたバブルソート

def bubbleSort(values): 
    n = len(values) - 1 
    swap = True 
    ncomp = 0 # My total comparisons counter 
    while swap: 
     swap = False 
     for i in range(n): # i = 0, 1, 2, ..., n-1 
      ncomp += 1 
      if values[i] > values[i+1]: 
       temp = values[i] 
       values[i] = values[i+1] 
       values[i+1] = temp 
       swap = True 
    return values, ncomp 

だから、基本的に私が作成する方法を知らない 『だけを作成するために管理両方向の旅を泡するbubbleSortPlus機能、最適化されたバブルソート』を:左から右へ、右から左への移動が直ちに続きます。理論的には、各パスでは、バブルの移動を短くする必要があります(変数内で最後のスワップの位置を保存し、その位置で次の移動を開始します)。

+0

[バブルソートコードのデバッグ方法](http://stackoverflow.com/a/36932606/2521214)を参照すると、内部ループカウントが時間とともに変化する最適化が見つかります。あなたが話している最適化は、2つのパスがお互いに往復するので、全く助けにならないでしょう。オーバーヘッドは言うまでもなく、結果は間違っている(適切にコーディングされていない場合)か、それ以前には遅くなります。 – Spektre

答えて

0

各繰り返しでリストを縮小しながら配列を前後にスキャンする方法を示すスケルトンコードです。

values = 100,101,102,103,104,105 

start = 0 
stop = len(values)-1 

while stop > start: 
    for i in range(start, stop): 
     print i, "compare", values[i], "with", values[i+1] 
    print "moved a large value to index", stop 
    print 

    stop = stop - 1 
    if stop == start: 
     break 

    for i in range(stop, start, -1): 
     print i, "compare", values[i], "with", values[i-1] 
    print "moved a small value to index", start 
    print 

    start = start + 1 
+0

クールですが、どうすれば合計の比較カウンターを追加できますか? – Anderson

+0

@Andersonこれは単なる出発点です。実際に比較/スワップを行うコードを追加し、比較カウンタを追加する必要があります。 – user3386109

+0

さて、お試しください。ありがとうございました – Anderson

0

ナイーブなバブルソートにはswapフラグが含まれていないので、いずれの場合もO(n^2)の比較をすべて終了するまで戻りません。 swapフラグを指定すると、入力シーケンスが「ほぼソート」されている場合、比較の数はほぼ直線的になります。

+0

これは通常のバブルソートで、10個の値の配列で自分の関数をテストし、このリンクと比較することができます。http://www.advanced-ict.info/interactive/algorithms.html – Anderson

+0

まあ、それは完全に主観的です。それが「最適化」されているかどうかにかかわらず。私はちょうどあなたに、バブルソートについて話すときに多くの人々が保持する一種の見解を伝えています。 https://en.wikipedia.org/wiki/Bubble_sort –

関連する問題