私は Python でクイックソート プログラムを作成しました。ここでの目標は、使用された比較の合計を計算することです。という名前のグローバル変数を宣言しましたthesum
。パーティション関数で使用すると、正しくthesum
計算できます。thesum
ただし、再帰関数で合計を計算しようとすると、間違った答えが返されました。これが私がそれぞれ行ったことです:
方法 1:
分割関数の合計を計算します。
def partition(listToSort, start, end):
global thesum
thesum = thesum+end-start
私が使用している分割アルゴリズムでは、長さ m の配列を分割するときに m-1 を追加する必要があります。
方法 2:
再帰関数 qsort で合計を計算します。
def qsort(listTo, start, end):
if start >= end :
return
else:
index = partition(listTo, start, end)
qsort(listTo, start, index-1)
global thesum
thesum = thesum + index-1-start
qsort(listTo, index+1, end)
thesum = thesum + end-index-1
このメソッドでthesum
は、 は初期化されません0
が、元の配列の長さから 1 を引いた値になります。
知っておく必要があるかもしれないこと:
私が実装しているアルゴリズムは、クイックソートの単純なバージョンです。リストがあり、このプログラムで並べ替える必要があります。グローバル変数を使用して、アルゴリズムが実行する必要がある比較の合計を示します。
問題と質問
2つの方法は同等だと思いますが、異なる答えが得られました。印刷によるいくつかのテストの後thesum
、このグローバル変数が関数内で期待どおりに機能しないことがわかりましたqsort
。たとえば、10 要素の配列を並べ替えると、thesum
9 に初期化されましたが、後で 8 として出力されます。これは奇妙です。しかし、なぜ?関数内でグローバルとして宣言し、関数内と同じ方法で使用しますpartition
。私が考えることができるすべての違いは、それqsort
が再帰関数であることです。しかし、それはどのように違いを生むのでしょうか? グローバル変数を再帰関数で使用することは想定されていませんか?