-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsorts.py
More file actions
80 lines (74 loc) · 1.92 KB
/
sorts.py
File metadata and controls
80 lines (74 loc) · 1.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# Most functions here are not used in the project, only QS is. The other functions are simply here
# To test the algorithm implementation, they may be removed if desired.
def quick_sort(arr, kv=False):
"""
Sorts a list using quicksort
Args:
arr (list): A list of elements
Returns:
arr (list): A sorted list of elements
"""
if len(arr) == 1 or len(arr) == 0:
return arr
pivot = int(len(arr)/2)
if kv == True:
less = [i for i in arr if i[0]<arr[pivot][0]]
equal = [i for i in arr if i[0]==arr[pivot][0]]
greater = [i for i in arr if i[0]>arr[pivot][0]]
else:
less = [i for i in arr if i<arr[pivot]]
equal = [i for i in arr if i==arr[pivot]]
greater = [i for i in arr if i>arr[pivot]]
return quick_sort(less) + equal + quick_sort(greater)
def merge_sort(arr):
"""
Sorts a list using merge sort
Args:
arr (list): A list of elements
Returns:
arr (list): A sorted list of elements
"""
if (len(arr) == 1):
return arr
middle = int(len(arr)/2)
lower = [arr[i] for i in range(middle)]
upper = [arr[i] for i in range(middle, len(arr))]
arr = _merge(merge_sort(lower), merge_sort(upper))
return arr
def _merge(lower, upper):
"""
A private helper function to merge two sorted arrays using quicksort
Args:
lower (list): A list of sorted elements
upper (list): A list of sorted elements
Returns:
arr (list): A sorted list of elements from lower and upper
"""
new_arr = []
i = 0
j = 0
while i!=len(lower) or j!=len(upper):
if i==len(lower) or (j<len(upper) and upper[j]<=lower[i]):
new_arr.append(upper[j])
j += 1
else:
new_arr.append(lower[i])
i += 1
return new_arr
def insertion_sort(arr):
"""
Sorts a list using insertion sort
Args:
arr (list): A list of elements
Returns:
arr (list): A sorted list of elements
"""
for i in range(1, len(arr)):
elem = arr[i]
j = i-1
while j>=0 and elem<arr[j]:
arr[j+1] = arr[j]
j -= 1
inversions += 1
arr[j+1] = elem
return inversions