前提・実現したいこと
pythonのクイックソートの関数を定義し、思うように動作できたのですが、比較回数と交換回数をカウントしようとあれこれやっているのですが、うまく動作せず試行錯誤しています。
発生している問題・エラーメッセージ
comp は比較回数、sort は交換回数として、実行すると以下のように途中から数字が乱れていきます。
-追記-
比較回数が正しいカウント数にならないです。
どこにインクリメント式を挿入していればいいのでしょうか?
クイックソートにおける比較箇所がいまいちわかりません。
comp = 1 comp = 2 comp = 3 comp = 4 comp = 5 comp = 6 comp = 7 sort = 1 comp = 8 comp = 9 comp = 10 comp = 11 comp = 12 sort = 2 sort = 3 comp = 13 comp = 14 comp = 15 sort = 4 comp = 16 sort = 5 sort = 6 sort = 5 sort = 2
該当のソースコード
カウントする処理を入れる前のクイックソートのソース
python
1def quick_sort(arry): 2 3 n = len(arry) 4 if n <= 1: 5 return arry 6 7 center = arry[0] 8 right=[] 9 left=[] 10 11 for i in range(1,n): 12 if arry[i][2] >= center[2]: 13 left.append(arry[i]) 14 else: 15 right.append(arry[i]) 16 17 r = quick_sort(right) 18 l = quick_sort(left) 19 20 return l+[center]+r
カウント処理を加えてみたソース
python
1def quick_sort(self, data, comp_count, sort_count): 2 3 n = len(data) 4 if n <= 1: 5 return data 6 7 center = data[0] 8 right=[] 9 left=[] 10 11 for i in range(1,n): 12 if data[i][2] >= center[2]: 13 left.append(data[i]) 14 else: 15 right.append(data[i]) 16 comp_count += 1 17 print("comp = %s" %comp_count) 18 19 sort_count += 1 20 print("sort = %s" %sort_count) 21 r = quick_sort(self, right, comp_count, sort_count) 22 sort_count += 1 23 print("sort = %s" %sort_count) 24 l = quick_sort(self, left, comp_count, sort_count) 25 26 self.comp_count = comp_count 27 self.sort_count = sort_count 28 29 return l+[center]+r
試したこと
再帰する際におかしくなっていると推測できたので、カウントの位置を変えたり引数を考えてみたりしましたが、これといった解決法が思いつきません。
カウントする際の変数は、データ構造?を使ってますが特にこだわりはありません。
補足情報(FW/ツールのバージョンなど)
python3.8.2のOS X Mojaveです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/25 06:01 編集
2020/06/25 06:04
2020/06/25 06:14
2020/06/25 06:27