## Lekcja szybkie sortowanie (quick sort)

```def divide(list, start, end):

i = start
border_value = list[end]

for j in range(start, end):

if list[j] <= border_value:
list[i], list[j] = list[j], list[i]
i += 1

list[i], list[end] = list[end], list[i]
return i

def quick_sort(list, start, end):

if start < end:

border_index = divide(list, start, end)
quick_sort(list, start, border_index -1)
quick_sort(list, border_index + 1, end)

list = [20, 7, 5, 8, 9, 8, 22, 34, 6, 18, 15]
quick_sort(list, 0, len(list)-1)

list
```

## Rozwiązanie

```import time
import random

#declarations
max_limit = 20000

my_list1 = [random.randint(0, max_limit) for i in range(max_limit)]
my_list2 = my_list1.copy()
my_list3 = my_list1.copy()
my_list4 = my_list1.copy()
my_list5 = my_list1.copy()
my_list6 = my_list1.copy()

# functions

def sort_bubble(list):

is_change = True

while is_change:
is_change = False
for i in range(len(list)-1):
if list[i] > list[i+1]:
list[i],list[i+1] = list[i+1],list[i]
is_change = True

def sort_bubble2(list):

# don't compare values at the end of the list - they are already sorted
max_index = len(list) - 1

for max_not_sorted_index in range(max_index,0,-1):
is_change = False
for i in range(max_not_sorted_index):
if list[i] > list[i+1]:
list[i],list[i+1] = list[i+1],list[i]
is_change = True

if not is_change:
break

def sort_insert(list):

# starting from 1, because this first element is already "sorted"
# all items need to be put in place, so this loop needs to iterate for every element
for sort_border in range(1,len(list)):
# we will try to put the new item into the sublist of sorted elements
curr_idx = sort_border - 1
value = list[curr_idx+1] # next value to be inserted into data

while list[curr_idx] > value and curr_idx >= 0:
list[curr_idx+1] = list[curr_idx]
curr_idx = curr_idx-1

#now the good position has been found and we put there the considered element
list[curr_idx+1] = value

def sort_select(list):

for run in range(len(list)):
min_index = run
for i in range(run+1, len(list)):
if list[i] < list[min_index]:
min_index = i
list[run], list[min_index] = list[min_index], list[run]

def sort_merge(list):

list_len = len(list)
sorted_list = []

if list_len <= 1:
sorted_list = list
else:
middle_point = list_len // 2
list_left = sort_merge(list[:middle_point])
list_right = sort_merge(list[middle_point:])

idx_left = idx_right = 0
while  idx_left < len(list_left) and idx_right < len(list_right):
if list_left[idx_left] < list_right[idx_right]:
sorted_list.append(list_left[idx_left])
idx_left += 1
else:
sorted_list.append(list_right[idx_right])
idx_right += 1

sorted_list.extend(list_left[idx_left:])
sorted_list.extend(list_right[idx_right:])

return sorted_list

def quick_sort_divide(list, start, end):

i = start
border_value = list[end]

for j in range(start, end):

if list[j] <= border_value:
list[i], list[j] = list[j], list[i]
i += 1

list[i], list[end] = list[end], list[i]
return i

def quick_sort(list, start, end):

if start < end:

border_index = quick_sort_divide(list, start, end)
quick_sort(list, start, border_index -1)
quick_sort(list, border_index + 1, end)

# checking time - case sort_bubble

start = time.time()
sort_bubble(my_list1)
stop = time.time()
print(f'Sorting duration for function sort_bubble:    {stop - start}')

# checking time - case sort_bubble2

start = time.time()
sort_bubble2(my_list2)
stop = time.time()
print(f'Sorting duration for function sort_bubble2:   {stop - start}')

# checking time - case  sort_insert

start = time.time()
sort_insert(my_list3)
stop = time.time()
print(f'Sorting duration for function sort_insert:    {stop - start}')

# checking time - case  sort_select

start = time.time()
sort_select(my_list4)
stop = time.time()
print(f'Sorting duration for function sort_select:    {stop - start}')

# checking time - case  sort_merge

start = time.time()
sort_merge(my_list5)
stop = time.time()
print(f'Sorting duration for function sort_merge:    {stop - start}')

# checking time - case  quick_sort

start = time.time()
quick_sort(my_list6, 0, len(my_list6)-1)
stop = time.time()
print(f'Sorting duration for function quick_sort:     {stop - start}')

```