mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-05 08:16:50 +08:00
merge: Add alternative implementation for InsertionSort and relative test. Add additional algorithm description (#915)
Co-authored-by: Andrea Tota <tota@qi4m.com>
This commit is contained in:
@ -1,9 +1,10 @@
|
|||||||
/* In insertion sort, we divide the initial unsorted array into two parts;
|
/* In insertion sort, we divide the initial unsorted array into two parts;
|
||||||
* sorted part and unsorted part. Initially the sorted part just has one
|
* 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 (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
|
* 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.
|
* the correct position and expand sorted part one element at a time.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export function insertionSort (unsortedList) {
|
export function insertionSort (unsortedList) {
|
||||||
const len = unsortedList.length
|
const len = unsortedList.length
|
||||||
for (let i = 1; i < len; i++) {
|
for (let i = 1; i < len; i++) {
|
||||||
@ -19,3 +20,43 @@ export function insertionSort (unsortedList) {
|
|||||||
unsortedList[j + 1] = tmp
|
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
Sorts/test/InsertionSort.test.js
Normal file
19
Sorts/test/InsertionSort.test.js
Normal file
@ -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])
|
||||||
|
})
|
||||||
|
})
|
Reference in New Issue
Block a user