forked from TheAlgorithms/Python
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
1958cf2
commit a97ab2f
Showing
1 changed file
with
49 additions
and
36 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,68 +1,81 @@ | ||
def binary_search(the_array, item, start, end): | ||
def binary_search(lst, item, start, end): | ||
if start == end: | ||
if the_array[start] > item: | ||
if lst[start] > item: | ||
return start | ||
else: | ||
return start + 1 | ||
if start > end: | ||
return start | ||
|
||
mid = (start + end)/ 2 | ||
if the_array[mid] < item: | ||
return binary_search(the_array, item, mid + 1, end) | ||
elif the_array[mid] > item: | ||
return binary_search(the_array, item, start, mid - 1) | ||
mid = (start + end) // 2 | ||
if lst[mid] < item: | ||
return binary_search(lst, item, mid + 1, end) | ||
elif lst[mid] > item: | ||
return binary_search(lst, item, start, mid - 1) | ||
else: | ||
return mid | ||
|
||
|
||
""" | ||
Insertion sort that the heap sort uses if the array size is small or if | ||
the size of the "run" is small | ||
""" | ||
def insertion_sort(the_array): | ||
l = len(the_array) | ||
for index in range(1, l): | ||
value = the_array[index] | ||
pos = binary_search(the_array, value, 0, index - 1) | ||
the_array = the_array[:pos] + [value] + the_array[pos:index] + the_array[index+1:] | ||
return the_array | ||
def insertion_sort(lst): | ||
length = len(lst) | ||
|
||
for index in range(1, length): | ||
value = lst[index] | ||
pos = binary_search(lst, value, 0, index - 1) | ||
lst = lst[:pos] + [value] + lst[pos:index] + lst[index+1:] | ||
|
||
return lst | ||
|
||
|
||
def merge(left, right): | ||
"""Takes two sorted lists and returns a single sorted list by comparing the | ||
elements one at a time. | ||
[1, 2, 3, 4, 5, 6] | ||
""" | ||
if not left: | ||
return right | ||
|
||
if not right: | ||
return left | ||
|
||
if left[0] < right[0]: | ||
return [left[0]] + merge(left[1:], right) | ||
|
||
return [right[0]] + merge(left, right[1:]) | ||
|
||
|
||
def timsort(the_array): | ||
def timsort(lst): | ||
runs, sorted_runs = [], [] | ||
l = len(the_array) | ||
new_run = [the_array[0]] | ||
for i in range(1, l): | ||
if i == l-1: | ||
new_run.append(the_array[i]) | ||
length = len(lst) | ||
new_run = [lst[0]] | ||
sorted_array = [] | ||
|
||
for i in range(1, length): | ||
if i == length - 1: | ||
new_run.append(lst[i]) | ||
runs.append(new_run) | ||
break | ||
if the_array[i] < the_array[i-1]: | ||
|
||
if lst[i] < lst[i - 1]: | ||
if not new_run: | ||
runs.append([the_array[i-1]]) | ||
new_run.append(the_array[i]) | ||
runs.append([lst[i - 1]]) | ||
new_run.append(lst[i]) | ||
else: | ||
runs.append(new_run) | ||
new_run = [] | ||
else: | ||
new_run.append(the_array[i]) | ||
for each in runs: | ||
sorted_runs.append(insertion_sort(each)) | ||
sorted_array = [] | ||
new_run.append(lst[i]) | ||
|
||
for run in runs: | ||
sorted_runs.append(insertion_sort(run)) | ||
|
||
for run in sorted_runs: | ||
sorted_array = merge(sorted_array, run) | ||
print(sorted_array) | ||
|
||
return sorted_array | ||
|
||
|
||
def main(): | ||
|
||
lst = [5,9,10,3,-4,5,178,92,46,-18,0,7] | ||
sorted_lst = timsort(lst) | ||
print(sorted_lst) | ||
|
||
if __name__ == '__main__': | ||
main() |