diff --git a/Sorts/BubbleSort.js b/Sorts/BubbleSort.js index 1ed5c70d6e..202d769a70 100644 --- a/Sorts/BubbleSort.js +++ b/Sorts/BubbleSort.js @@ -2,6 +2,7 @@ * compares adjacent element and swaps their position * The big O on bubble sort in worst and best case is O(N^2). * Not efficient. +* Somehow if the array is sorted or nearly sorted then we can optimize bubble sort by adding a flag. * * In bubble sort, we keep iterating while something was swapped in * the previous inner-loop iteration. By swapped I mean, in the @@ -17,16 +18,23 @@ */ export function bubbleSort (items) { const length = items.length + let noSwaps - for (let i = (length - 1); i > 0; i--) { + for (let i = length; i > 0; i--) { + // flag for optimization + noSwaps = true // Number of passes - for (let j = (length - i); j > 0; j--) { + for (let j = 0; j < (i - 1); j++) { // Compare the adjacent positions - if (items[j] < items[j - 1]) { + if (items[j] > items[j + 1]) { // Swap the numbers - [items[j], items[j - 1]] = [items[j - 1], items[j]] + [items[j], items[j + 1]] = [items[j + 1], items[j]] + noSwaps = false } } + if (noSwaps) { + break + } } return items diff --git a/Sorts/test/BubbleSort.test.js b/Sorts/test/BubbleSort.test.js index fff23721d1..87ff3e15ab 100644 --- a/Sorts/test/BubbleSort.test.js +++ b/Sorts/test/BubbleSort.test.js @@ -6,6 +6,7 @@ describe('bubbleSort', () => { expect(bubbleSort([])).toEqual([]) expect(bubbleSort([1, 2, 3])).toEqual([1, 2, 3]) expect(bubbleSort([5, 6, 7, 8, 1, 2, 12, 14])).toEqual([1, 2, 5, 6, 7, 8, 12, 14]) + expect(bubbleSort([5, 6, 7, 8, 9, 4])).toEqual([4, 5, 6, 7, 8, 9]) }) })