-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmergeSort.py
149 lines (130 loc) · 4.62 KB
/
mergeSort.py
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
def merge(array1, array2):
new_arr = array1 + array2
a1 = 0
a2 = 0
i = 0
while a2 != len(array2) and a1 != len(array1):
if array1[a1] > array2[a2]:
new_arr[i] = array2[a2]
a2 += 1
else:
new_arr[i] = array1[a1]
a1 += 1
i += 1
while a1 < len(array1):
new_arr[i] = array1[a1]
a1 += 1
i += 1
while a2 < len(array2):
new_arr[i] = array2[a2]
a2 += 1
i += 1
return new_arr
# def merge_sort(array):
# if len(array) <= 2:
# if array[0] > array[len(array) - 1]:
# array[0], array[len(array) - 1] = array[len(array) - 1], array[0]
# return array
# new_index = len(array) // 2
# left = merge_sort(array[0:new_index])
# right = merge_sort(array[new_index:len(array)])
#
# return merge(left, right)
def binaryInsertionSort(left_p, right_p, a):
global array
el = array[a]
left = left_p
right = right_p
while left < right:
mid = (right + left) // 2
if array[mid] > array[a]:
right = mid
else:
left = mid + 1
print(left)
for i in range(a, left, -1):
array[i], array[i - 1] = array[i - 1], array[i]
def reversedBinaryInsertionSort(left_p, right_p, a):
global array
el = array[a]
left = left_p
right = right_p
while left < right:
mid = (right + left) // 2
if array[mid] < array[a]:
right = mid
else:
left = mid + 1
print(left)
for i in range(a, left, -1):
array[i], array[i - 1] = array[i - 1], array[i]
def reverse(index1, index2):
global array
while index1 < index2:
array[index1], array[index2] = array[index2], array[index1]
index1 += 1
index2 -= 1
def getMinRun(n):
r = 0
while n >= 64:
r |= n & 1
n >>= 1
return n + r
def TimSort():
global array
minRun = 3
pointer = 0
pointer = 0
array_of_runs = []
while pointer < len(array) - 1:
start_run = pointer
if array[pointer] < array[pointer + 1]: #increment subsequence
if start_run + minRun < len(array):
for pointer in range(start_run, start_run + minRun - 1):
if array[pointer] > array[pointer + 1]:
binaryInsertionSort(start_run, pointer, pointer + 1)
else:
for pointer in range(start_run, len(array) - 1):
if array[pointer] > array[pointer + 1]:
binaryInsertionSort(start_run, pointer, pointer + 1)
while pointer + 1 < len(array) and array[pointer] <= array[pointer + 1]:
pointer += 1
else: #decrement subsequence
if start_run + minRun < len(array):
for pointer in range(start_run, start_run + minRun - 1):
if array[pointer] < array[pointer + 1]:
reversedBinaryInsertionSort(start_run, pointer, pointer + 1)
else:
for pointer in range(start_run, len(array) - 1):
if array[pointer] < array[pointer + 1]:
reversedBinaryInsertionSort(start_run, pointer, pointer + 1)
while pointer + 1 < len(array) and array[pointer] >= array[pointer + 1]:
pointer += 1
reverse(start_run, pointer)
array_of_runs.append(array[start_run: pointer + 1])
pointer += 1
print(merging(array_of_runs))
def merging(array_of_runs):
while len(array_of_runs) >= 3:
if len(array_of_runs[2]) > len(array_of_runs[0]) + len(array_of_runs[1]) :
if len(array_of_runs[0]) > len(array_of_runs[1]):
new = merge(array[0], array[1])
array_of_runs.pop(0)
array_of_runs[0] = new
else:
a = min(array_of_runs[0], array_of_runs[2])
new = merge(array_of_runs[1], a)
array_of_runs.pop(0)
array_of_runs[0] = new
else:
a = min(array_of_runs[0], array_of_runs[2])
new = merge(array_of_runs[1], a)
array_of_runs.pop(0)
array_of_runs[0] = new
if len(array_of_runs) == 2:
new = merge(array_of_runs[0], array_of_runs[1])
array_of_runs.pop()
return new
return array_of_runs
array = [6, 10, 54, 2, 1, 3, 4, 5, 6, 7, 7, 7, 68, 3,43, 12, 32, 1]
TimSort()