Вы находитесь на странице: 1из 13

divide and conquer

“разделяй и властвуй”
Алгоритмическая парадигма
«Разделяй и властвуй»
1. Разделение. Задача разбивается на несколько
подзадач, которые представляют собой меньше
экземпляры той же самой задачи
2. Властвование. Рекурсивно решаются подзадачи. Если
они становятся достаточно малыми — то решается
задача базового (базовых) случаев.
3. Объединение. Решения подзадач объединяются в
решение исходной задачи.
quicksort
Один из самых популярных “быстрых” алгоритмов
сортировки списков, разработанный в 1960 году
английским ученым Чарльзом Хоаром, так и
называется — “быстрая сортировка”
Алгоритм quicksort
1) выберем некоторый элемент массива Х;
2) разделим массив на три части: в первую включим
элементы, меньшие Х, во вторую — элементы,
равные Х, а в третью — элементы, большие Х;
3) отсортируем первую и третью части массива
таким же способом.
Функция quickSort
def quickSort ( A ):
if len(A) < 2: return A
L, X, R = partition ( A )
return quickSort(L) + X + quickSort(R)
Функция partition — разбиение
исходного
def partition ( A ):
списка на три
P = random.choice(A) #случайный выбора элемента
#функция choice из модуля
random.
L = [x for x in A if x < P]
X = [x for x in A if x == P]
R = [x for x in A if x > P]
return L, X, R
Сортировка слиянием ( Merge sort)
Алгоритм
Массив делится на две половины, каждая из
половин сортируется отдельно,
а затем два полученных массива сливаются
так, что бы получился один отсортированный
массив
Функция mergeSort
def mergeSort ( A ):
if len(A) < 2: return A
mid = len(A) // 2
L = mergeSort(A[:mid])
R = mergeSort(A[mid:])
return merge ( L, R )
Функция merge
def merge ( a, b ):
res = []
while a and b:
if a[–1] >= b[–1]: # сравниваем два последних элемента массивов
res.append(a.pop()) # добавляем в конец res наибольший из них.
else: res.append(b.pop())
res.reverse()
return a + b + res # a или b —пустой
Сравнение методов
Import time
t=time.clock()
Задания для самостоятельной
работы
1Написать программы сортировки методами
mergeSort и quicksort
Оттестировать и оформить их в
виде отдельных функций
3 Провести анализ времени выполнения
функций сортировки всеми методами
«пузырек»,вставки, быстрая сортировка,
слиянием. Результат представит в виде
таблицы. Для тестов сформировать массивы
разных размеров используя модуль random
Для контроля времени
работы функций
использовать модуль
time.
Т.е. программа
должна иметь
следующую структуру

Вам также может понравиться