def quicksort(L, low, high):
total = 0
if low < high:
pivot_location, total = Partition(L, low, high)
total += quicksort(L,low,pivot_location)
total += quicksort(L,pivot_location + 1, high)
return total
def Partition(L, low, high):
print(L)
#print(high)
total = 0
if (high - low) % 2 == 0:
middle = (high - low) // 2 - 1
else:
middle = ((high - low) // 2) + low
print(L[low])
print(L[high - 1])
print(L[middle])
numbers = []
numbers.append(L[low])
numbers.append(L[middle])
numbers.append(L[high - 1])
if L[low] > L[middle] and L[low] < L[high - 1]:
pivot = L[low]
elif L[low] >L[high -1] and L[low] < L[middle]:
pivot = L[low]
elif L[middle] < L[low] and L[middle] > L[high -1]:
temp = L[low]
L[low] = L[middle]
L[middle] = temp
pivot = L[low]
elif L[middle] < L[high - 1] and L[middle] > L[low]:
temp = L[low]
L[low] = L[middle]
L[middle] = temp
pivot = L[low]
elif L[high - 1] < L[low] and L[high - 1] > L[middle]:
temp = L[low]
L[low] = L[high - 1]
L[high - 1] = temp
pivot = L[low]
else:
temp = L[low]
L[low] = L[high - 1]
L[high - 1] = temp
pivot = L[low]
print(pivot)
i = low + 1
for j in range(low + 1,high,1):
total += 1
if L[j] < pivot:
temp = L[j]
L[j] = L[i]
L[i] = temp
i += 1
temp = L[low]
L[low] = L[i -1]
L[i - 1] = temp
#print(L)
return i - 1,total
c = [2148,9058,7742,3153,6324,609,7628,5469,7017,504]
print(quicksort(c, 0, len(c)))
print(c)
私はクイックソートをこのように実装しました。最初の要素をピボットとして、最後の要素をピボットとして使用してみましたが、完全に機能しました。しかし、私は3つの要素の中央値をピボットとして選択する方法を理解することはできません:まず、中、最後。それぞれの再帰呼び出しで選択する方法に関するヘルプは、中間要素を呼び出します。私は余分なメモリを使いたくないので、配列全体の各再帰呼び出しに引数として渡したいと思います。Quicksort - 選択した3つのピボットのメディア
はい、私はこれをやっていますが、問題は、各再帰呼び出しの各部分配列で中間の項目を選択する方法を見つけることができないということです。各再帰呼び出しにおける各サブアレイの境界は、低および高変数の値から設定される。 –
いいえ、以下のpに掲載されたコードを使用して、レースで分割された部分配列の中間要素が適切に選択されていません。分割された各サブアレイの正しい中間要素を選択する方法が必要です。 –
もう一つのバグがあります。ミドルミドル=(ハイ - ロー)// 2 - 1の計算には、おそらく "ハイ+ロー"と "-1"がありませんでした。いずれにしても、 'middle =(low + high)// 2'は奇数と偶数の両方で良いでしょう。 –