Skip to content

Add alternative implementation for InsertionSort and relative test. #915

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 46 additions & 5 deletions Sorts/InsertionSort.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
/* In insertion sort, we divide the initial unsorted array into two parts;
* sorted part and unsorted part. Initially the sorted part just has one
* element (Array of only 1 element is a sorted array). We then pick up
* element one by one from unsorted part; insert into the sorted part at
* the correct position and expand sorted part one element at a time.
*/
* sorted part and unsorted part. Initially the sorted part just has one
* element (Array of only 1 element is a sorted array). We then pick up
* element one by one from unsorted part; insert into the sorted part at
* the correct position and expand sorted part one element at a time.
*/

export function insertionSort (unsortedList) {
const len = unsortedList.length
for (let i = 1; i < len; i++) {
Expand All @@ -19,3 +20,43 @@ export function insertionSort (unsortedList) {
unsortedList[j + 1] = tmp
}
}

/**
* @function insertionSortAlternativeImplementation
* @description InsertionSort is a stable sorting algorithm
* @param {Integer[]} array - Array of integers
* @return {Integer[]} - Sorted array
* @see [InsertionSort](https://en.wikipedia.org/wiki/Quicksort)
*/

/*
* Big-O Analysis
* Time Complexity
- O(N^2) on average and worst case scenario
- O(N) on best case scenario (when input array is already almost sorted)
* Space Complexity
- O(1)
*/

export function insertionSortAlternativeImplementation (array) {
const length = array.length
if (length < 2) return array

for (let i = 1; i < length; i++) {
// Take current element in array
const currentItem = array[i]
// Take index of previous element in array
let j = i - 1

// While j >= 0 and previous element is greater than current element
while (j >= 0 && array[j] > currentItem) {
// Move previous, greater element towards the unsorted part
array[j + 1] = array[j]
j--
}
// Insert currentItem number at the correct position in sorted part.
array[j + 1] = currentItem
}
// Return array sorted in ascending order
return array
}
19 changes: 19 additions & 0 deletions Sorts/test/InsertionSort.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { insertionSortAlternativeImplementation } from '../InsertionSort'

describe('insertionSortAlternativeImplementation', () => {
it('expects to work with empty array', () => {
expect(insertionSortAlternativeImplementation([])).toEqual([])
})

it('expects to return input array when array.length is less than 2', () => {
const input = [3]
expect(insertionSortAlternativeImplementation(input)).toEqual(input)
})

it('expects to return array sorted in ascending order', () => {
expect(insertionSortAlternativeImplementation([14, 11])).toEqual([11, 14])
expect(insertionSortAlternativeImplementation([21, 22, 23])).toEqual([21, 22, 23])
expect(insertionSortAlternativeImplementation([1, 3, 2, 3, 7, 2])).toEqual([1, 2, 2, 3, 3, 7])
expect(insertionSortAlternativeImplementation([1, 6, 4, 5, 9, 2])).toEqual([1, 2, 4, 5, 6, 9])
})
})