2016-03-26 6 views
0

私は入力として配列を取得し、クイックソートアルゴリズムでそれをソートするクラスを開発しました。アルゴリズムは分割と征服の方法に基づいているので、再帰的です。グローバル値を設定しようとしていて、デフォルト値としてパーティション関数にパラメータを渡そうとしていますが、機能しません。 入力を求めた後、以下のエラーが表示されます。 これは誤りである:ここ特定の関数で入力を取得し、それを同じクラスの別の関数でPythonで使う方法はありますか?

def partition(self, start = gl_start , end = gl_end): 
NameError: name 'gl_start' is not defined 

は私が簡単な答えでこだわっている知っているコード

class quick: 
    def __init__(self,text = input(' Please insert an array: ')): 
     global gl_start 
     global gl_end 
     array = text.split(',') 
     gl_start = 0 
     gl_end = len(array) - 1 
     self.array = array 
     self.start = gl_start 
     self.end = gl_end 
    def partition(self, start = gl_start , end = gl_end): 
     pivot = self.array[start] 
     left = start + 1 
     right = end 
     done = False 
     while not done: 
      while left <= right and self.array[left] <= pivot: 
       left += left 
      while self.array[right] >= pivot and right >=left: 
       right -= right 
      if right < left: 
       done = True 
      else: 
       # swap places 
       print("Items swapped: {" + str(self.array[left]) + ' , ' + str(self.array[right]) + '} ') 
       temp=self.array[left] 
       self.array[left]=self.array[right] 
       self.array[right]=temp 
      # swap start with myList[right] 
      print("Pivotpoint swap : [" + str(self.array[start]) + '] ----> [' + str(self.array[right]) + '] ') 
      temp=self.array[start] 
      self.array[start]=self.array[right] 
      self.array[right]=temp 
      print(" Updated array is : " + str(myList)) 
      return right 
    def quicksort(self, start = gl_start , end = gl_end): 
     if start < end: 
      # partition the list 
      pivot = self.partition(start, end) 
      # sort both halves 
      self.quicksort(start, pivot-1) 
      self.quicksort(pivot+1,end) 
     return self.array 


myList = quick() 
myList = quick.quicksort() 

です。どんな助けもありがたいです ありがとうございました!

+0

ほとんどの目立つエラーは 'text = input(...)'です。これは*正確に1回*実行され、その値はコンストラクタに 'text'引数が与えられていないすべての場合に共有されます。たとえば、 'text = None'; 'もし' textがNoneならば 'text = input()'の中で '__init__' –

答えて

0

グローバルを使用しないでください。あなたは属性にアクセスするためにself.gl_startなどを使用しますが、self.gl_startなどを使用することはできませんのでエラーは修正されません。argsとして、startlen(myList.array) -1あなたがquicksortを呼び出して、配列を作成するのinitバーからすべてを削除します。

class Quick: 
    def __init__(self): 
     self.array = input(' Please insert an array: ').split(',') 

    def partition(self, start, end): 
     pivot = self.array[start] 
     left = start + 1 
     right = end 
     done = False 
     while not done: 
      while left <= right and self.array[left] <= pivot: 
       left += 1 
      while self.array[right] >= pivot and right >= left: 
       right -= 1 
      if right < left: 
       done = True 
      else: 
       # swap places 
       print("Items swapped: {" + str(self.array[left]) + ' , ' + str(self.array[right]) + '} ') 
       temp = self.array[left] 
       self.array[left] = self.array[right] 
       self.array[right] = temp 
      # swap start with myList[right] 
      print("Pivotpoint swap : [" + str(self.array[start]) + '] ----> [' + str(self.array[right]) + '] ') 
      temp = self.array[start] 
      self.array[start] = self.array[right] 
      self.array[right] = temp 
      print(" Updated array is : " + str(self.array)) 
      return right 

    def quicksort(self, start, end): 
     if start < end: 
      # partition the list 
      pivot = self.partition(start, end) 
      # sort both halves 
      self.quicksort(start, pivot - 1) 
      self.quicksort(pivot + 1, end) 
     return self.array 


myList = Quick() 
myList.quicksort(0, len(myList.array) - 1) 

ます。また、インスタンスを作成し、Quick.quicksortを呼び出していないインスタンス上でメソッドを呼び出す必要があります:

myList = Quick() 
myList.quicksort(0, len(myList.array) - 1) 

今すぐサンプル実行:

In [9]: q = Quick() 
Please insert an array: 22,11,3,121,3,55,2,66 

In [10]: q.quicksort(0, len(q.array) -1) 
Items swapped: {3 , 2} 
Pivotpoint swap : [22] ----> [3] 
Updated array is : ['3', '11', '2', '121', '3', '55', '22', '66'] 
Pivotpoint swap : [3] ----> [3] 
Updated array is : ['3', '11', '2', '121', '3', '55', '22', '66'] 
Pivotpoint swap : [3] ----> [121] 
Updated array is : ['121', '11', '2', '3', '3', '55', '22', '66'] 
Pivotpoint swap : [121] ----> [11] 
Updated array is : ['11', '121', '2', '3', '3', '55', '22', '66'] 
Out[10]: ['11', '121', '2', '3', '3', '55', '22', '66'] 

だから我々は、我々は別の問題を比較しているしている文字列が浮くので、我々は間違って何かが文字列と同じように、あなたのロジックでもあり、入力をキャストする必要があることを修正するために/ int型ではありません " 22 'は3の前に来なければならないので、あなたのコードに間違いなくバグがあります。

ので、あなたが浮かぶようにマッピングすることができる要素をキャストするには:私はあなたに残してバグを把握する

self.array = list(map(float,input(' Please insert an array: ').split(',')))