Skip to content

Commit

Permalink
Update timsort.py
Browse files Browse the repository at this point in the history
  • Loading branch information
theycallmemac authored Oct 1, 2017
1 parent 1958cf2 commit a97ab2f
Showing 1 changed file with 49 additions and 36 deletions.
85 changes: 49 additions & 36 deletions sorts/timsort.py
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()

0 comments on commit a97ab2f

Please sign in to comment.