Рубрики
Без рубрики

Как реализовать Quicksort в Python?

QuickSort – это алгоритм сортировки, который следует за политикой разрыва и завоевания. Работает на концепции выбора элемента поворота, а затем аранжировка

Автор оригинала: Pankaj Kumar.

QuickSort это Сортировка алгоритма Это следует за политикой разделить и победить. Работает на концепции выбора элемента поворота, а затем расположена элементы вокруг поворота, выполняя свопы. Это рекурсивно повторяет этот процесс, пока массив не будет сортироваться.

В этом руководстве мы узнаем, как работает Quicksort, и как писать код Python для его реализации.

Понимание алгоритма Quicksort

Первый шаг при выполнении Quicksort на массиве выбирает элемент поворота. Существуют различные способы выбора элемента поворота.

Вы можете выбрать Случайный элемент или вы можете выбрать медиана массива. Для простоты мы будем собирать Первый элемент массив Как наш поворот элемент.

1. Выбор элемента поворота

Как обсуждалось выше, первый элемент выбирается как элемент поворота.

pivot = array[start]

После выбора поворотного элемента нам нужно переставить элементы вокруг него. Мы переставляем элементы таким образом, чтобы все элементы меньше, чем у поворота, находятся слева, и все элементы, превышающие повороты, находятся справа.

как нам это сделать?

Давайте обсудим, что следующее.

2. Переставляющие элементы вокруг пивота

Чтобы изменить элементы вокруг поворота, мы инициализируем две переменные.

Давайте назовем эти переменные низкий и высокий.

Мы инициализируем низко со вторым элементом массива (один после поворота) и высоко с последним элементом.

 low = start + 1
 high = end

Чтобы переставить элементы, которые мы Переместите низко вправо и высоже к левому Отказ При этом наш мотив – убедиться, что все значения, превышающие поворотный, должны двигаться вправо, и все значения, меньшие, чем у поворота, должны двигаться влево.

Когда мы организуем значения таким образом, мы можем обнаружить окончательное положение элемента поворота в отсортированном массиве, так как все элементы меньше, чем у поворота, находятся в левом углу, и все элементы справа являются больше.

Элементы справа и слева от поворота могут или не могут быть организованы в сортировке.

3. Как двигаться низко и высокий?

Мы приближаемся к леве до высоких точек к значению, меньшим, чем пивот или до сих пор меньше низкого.

while low <= high and array[high] >= pivot:
     high = high - 1

Точно так же мы перемещаемся вправо, пока оно указывает на значение, которое выше, чем у поворота, либо до сих пор меньше низкого.

while low <= high and array[low] <= pivot:
     low = low + 1

После выхода из цикла мы проверяем, меньше или равно высоким. Если это так, то нам нужно поменять значения на высоком и низком.

 if low <= high:
     array[low], array[high] = array[high], array[low]
         

Если низкий уровень больше, чем высокий, мы вырываемся из цикла и возвращаемся высоко, когда положение элемента поворота. Это означает, что мы успешно устроили значения вокруг пивота.

4. Реализованный код до сих пор

Полный код для функции, отвечающей за выбор элемента поворота, а затем перенаправить элементы приведены ниже:

def pivot(array, start, end):

#initializing 
    pivot = array[start]
    low = start + 1
    high = end


    while True:
  
#moving high towards left
        while low <= high and array[high] >= pivot:
            high = high - 1

#moving low towards right 
        while low <= high and array[low] <= pivot:
            low = low + 1

#checking if low and high have crossed
        if low <= high:

#swapping values to rearrange
            array[low], array[high] = array[high], array[low]
         
        else:
#breaking out of the loop if low > high
            break

#swapping pivot with high so that pivot is at its right # #position 
    array[start], array[high] = array[high], array[start]

#returning pivot position
    return high

5. Сделайте рекурсивные звонки на две половины массива

После переставления элементов вокруг поворота мы должны сделать рекурсивные звонки на две половины массива.

Эти звонки повторят себя, пока у нас нет массивов размером один. Код для функции, который делает рекурсивные вызовы, приведены ниже:

def quick_sort(array, start, end):
    if start >= end:
        return

#call pivot 
    p = pivot(array, start, end)
#recursive call on left half
    quick_sort(array, start, p-1)
#recursive call on right half
    quick_sort(array, p+1, end)

Последние два утверждения делают рекурсивные звонки слева и правые половинки соответственно.

Тот же процесс выбора поворота и переходных элементов вокруг него повторяется для левой и правой половинки.

Когда мы делаем это неоднократно, мы уверены, что каждый элемент размещен в его правильном положении.

Здесь «правильная позиция» означает, что все меньшие элементы слева, и все большее элементы находятся справа. Когда все элементы размещены на своих правильных позициях, мы получаем отсортированный массив.

Пример массива Quicksort

Давайте возьмем пример для тестирования нашего кода.

[5,1,3,9,8,2,7]

Давайте добавим некоторый код для печати элемента поворота, слева половины и правой половины массива для каждого рекурсивного вызова.

def quick_sort(array, start, end):
    if start >= end:
        return

    p = pivot(array, start, end)
    print("Pivot",array[p])
    print("left :", array[start:p])
    print("right :",array[p+1:end+1])
    print("\n")
    quick_sort(array, start, p-1)
    quick_sort(array, p+1, end)

Давайте запустим код с нашим массивом образца выше.

array = [5,1,3,9,8,2,7]

quick_sort(array, 0, len(array) - 1)
print(array)

Выход выходит как:

Pivot 5
left : [2, 1, 3]
right : [8, 9, 7]


Pivot 2
left : [1]
right : [3]


Pivot 8
left : [7]
right : [9]


[1, 2, 3, 5, 7, 8, 9]

Мы видим, что для каждого элемента поворота левый массив содержит элементы, меньшие, чем шарнир, и правильный массив содержит элементы, превышающие повороты.

Визуально мы можем представлять рекурсивные звонки следующим образом:

Вращаться

Полная реализация

Полная реализация для QuickSort приведена ниже:

def pivot(array, start, end):

#initializing 
    pivot = array[start]
    low = start + 1
    high = end


    while True:
  
#moving high towards left
        while low <= high and array[high] >= pivot:
            high = high - 1

#moving low towards right 
        while low <= high and array[low] <= pivot:
            low = low + 1

#checking if low and high have crossed
        if low <= high:

#swapping values to rearrange
            array[low], array[high] = array[high], array[low]
         
        else:
#breaking out of the loop if low > high
            break

#swapping pivot with high so that pivot is at its right # #position 
    array[start], array[high] = array[high], array[start]

#returning pivot position
    return high


def quick_sort(array, start, end):
    if start >= end:
        return

#call pivot 
    p = pivot(array, start, end)
#recursive call on left half
    quick_sort(array, start, p-1)
#recursive call on right half
    quick_sort(array, p+1, end)


array = [5,1,3,9,8,2,7]

quick_sort(array, 0, len(array) - 1)
print(array)

Заключение

Это руководство было о реализации QuickSort в Python. Сложность худшего случая Quicksort – O (n 2 ) и СКОРОСТЬ СКОРОСТИ СЛОЖНОСТИ СЛОЖЕНИЯ O (N LOGN).