2017-03-11 8 views
0
L = [7, 12, 1, -2, 0, 15, 4, 11, 9] 


def quicksort(L, low, high): 
    if low < high: 
     pivot_location = Partition(L, low, high) 
     quicksort(L,low, pivot_location) 
     quicksort(L,pivot_location + 1, high) 
    return L 

def Partition(L, low, high): 
    pivot = L[low] 
    leftwall = low 
    for i in range(low + 1, high, 1): 
     if L[i] < pivot: 
      temp = L[i] 
      L[i] = L[leftwall] 
      L[leftwall] = temp 
      leftwall += 1 
    temp = pivot 
    pivot = L[leftwall] 
    L[leftwall] = temp 
    return leftwall 

print(quicksort(L, 0, len(L) - 1)) 

コードを実行すると、次の結果が生成されます。[-2、0、1,4、7、11、12、15、9]。 1つの要素が間違った位置にあります。誰が問題がどこにあるのか教えていただけたら?Quicksort in Python

+1

'high'は' len(L) 'でなければなりません...そして、' low、pivot'と 'ピボット、ハイ '(そうでないピボット+ 1)。 –

+0

私が行った変更のみで、コードは(len(L) - 1)の代わりにlen(L)です。分割は正しい。 –

答えて

1

を私はuのにPythonでQ_Sortを実装するための別の簡単な方法を示しています。

def q_sort(lst): 
    return [] if not lst else q_sort([e for e in lst[1:] if e <= lst[0]]) + [lst[0]] + q_sort([e for e in lst[1:] if e > lst[0]]) 


L = [7, 12, 1, -2, 0, 15, 4, 11, 9] 

print q_sort(L) 

となります。

[-2、0、1、4、7、9、11、12、15]

+1

OPのqsortが配列のインプレースを変更していることに注意してください。これは新しいリストを作成します(リストが非常に大きい場合、これが問題になるかもしれません) – Javier

+0

このメソッドは、パーティションを含むクイックソートのコアコンセプトを示しています。これはプロジェクトでは使用されていませんが、Pythonの魔法を表示するために使用することができます –

+0

はい、その実装が気に入っています。それは小さなリストのためだけに使うべきであるという事実にもかかわらず、実際にはPythonの魔法を示しています! –

1

私はこのコード行を変更し、それがうまく働いた:

quicksort(L, 0, len(L)) 

代わりの

ここ
quicksort(L, 0, len(L) - 1)