Можете ли вы помочь мне с этой задачей? Это из книги Р. Седжвика «Введение ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ В PYTHON Апдисциплинарный подход»
Разделение. Составьте функцию, которая сортирует массив, который, как известно, имеет не более двух разных значений. Подсказка: сохраняйте два указателя, один из которых начинается с левого конца и двигается вправо, а другой начинается с правого конца и двигается влево. Поддерживайте инвариант, чтобы все элементы слева от левого указателя были равны меньшему из двух значений, а все элементы справа от правого указателя равны большему из двух значений.
Так что я придумал это, но это не работает. Где я не прав? Я полагаю, это вызвано тем, что два метода quickSort2 вызываются друг за другом (я добавил туда несколько комментариев).
import sys
def quickSort2(arr, left, right, n, direction):
if n == 1:
return
if left > right:
return
if left == right:
print ("left ")
print([i for i in arr[len(arr)-n:left]])
print ("right ")
print([i for i in arr[left+1:len(arr)]])
print ("pivot ")
print(arr[left])
quickSort2(arr, len(arr)-n, left-1, left-len(arr)+n, True) # Is this ok?
quickSort2(arr, left+1, len(arr)-1, len(arr)-left-1, True) # Is this ok?
return
if direction:
if arr[left] < arr[right]:
quickSort2(arr, left+1, right, n, True)
#elif arr[left] > arr[right]:
else:
arr[left], arr[right] = arr[right], arr[left]
quickSort2(arr, left, right-1, n, False)
else:
if arr[left] < arr[right]:
quickSort2(arr, left, right-1, n, False)
#elif arr[left] > arr[right]:
else:
arr[left], arr[right] = arr[right], arr[left]
quickSort2(arr, left+1, right, n, True)
if __name__ == "__main__":
#array = [5,4,5,4]
#array = [5,4,5,4,4,5,4]
#array = [5,5,4,5,5,5,5,4,5,5,4,5,4,4,4,4,4,4,5,5,4,5,4]
array = [5,4,4,1,7,4,3,8,3,1]
quickSort2(array, 0, len(array) - 1, len(array), True)
for i in array: print (i, end = " ")
Например, для массива = [5,5,4,5,5,5,5, 4,5,5,4,5,4,4,4,4,4,4,5,5,4,5,4] возвращается
4 4 4 4 4 4 4 4 4 4 5 4 5 5 5 5 5 5 5 5 5 5 5