"""Insertion sort
1. Unoptimised (continuous swap method)
1.1 While loop version*
1.1.1 One with range() and len()
--> More readable?
--> More representative of insertion sort
1.1.2 One with enumerate()
--> More pythonic?
--> Negligibly slower by comparing 1 more element per iteration
1.2 For loop version
2. Semi-optimised (writing method with while loop)
--> but with pythonic enumerate()
*IF YOU ARE NEW TO INSERTION SORT, I SUGGEST LEARNING THE UNOPTIMISED CODES,
ESPECIALLY 1.1, BEFORE LEARNING THE SEMI-OPTIMISED VERSION.
**BUILD A SOLID FOUNDATION FOR YOUR UNDERSTANDING OF SORTS
"""
>>> Unoptimised -------------------------------------------------------------
# Method 1.1.1
def insertion_1(lst):
# Check all numbers from 2nd number
for i in range(1, len(lst)):
# Not smallest number AND curr < prev
while i != 0 and lst[i] < lst[i-1]:
# Swap and update curr index for further comparison
lst[i-1], lst[i] = lst[i], lst[i-1]
i -= 1
return lst # for easy testing
# Method 1.1.2
def insertion_2(lst):
# Check all numbers
for i, _ in enumerate(lst):
# Not smallest number AND curr < prev
while i != 0 and lst[i] < lst[i-1]:
# Swap and update curr index for further comparison
lst[i-1], lst[i] = lst[i], lst[i-1]
i -= 1
return lst # for easy testing
# Method 1.2
def insertion_3(lst):
# Check every number
for i, _ in enumerate(lst):
# Loop until sorted: Check curr < prev, and swap
for j in range(i, 0, -1):
if lst[j] < lst[j-1]:
lst[j], lst[j-1] = lst[j-1], lst[j]
else:
break
return lst # for easy testing
>>> Semi-optimised -------------------------------------------------------
# Method 2
def insertion_4(nums):
for i, curr_num in enumerate(nums):
# write curr to right until find correct index to put curr_num
while i != 0 and curr_num < nums[i-1]:
nums[i] = nums[i-1]
i -= 1
# Write curr_num into correct spot
nums[i] = curr_num
return nums # for easy testing