0

私は 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 要素の配列を並べ替えると、thesum9 に初期化されましたが、後で 8 として出力されます。これは奇妙です。しかし、なぜ?関数内でグローバルとして宣言し、関数内と同じ方法で使用しますpartition。私が考えることができるすべての違いは、それqsortが再帰関数であることです。しかし、それはどのように違いを生むのでしょうか? グローバル変数を再帰関数で使用することは想定されていませんか?

4

1 に答える 1