Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Insertion sort vs Bubble Sort Algorithms

I'm trying to understand a few sorting algorithms, but I'm struggling to see the difference in the bubble sort and insertion sort algorithm.

I know both are O(n2), but it seems to me that bubble sort just bubbles the maximum value of the array to the top for each pass, while insertion sort just sinks the lowest value to the bottom each pass. Aren't they doing the exact same thing but in different directions?

For insertion sort, the number of comparisons/potential swaps starts at zero and increases each time (ie 0, 1, 2, 3, 4, ..., n) but for bubble sort this same behaviour happens, but at the end of the sorting (ie n, n-1, n-2, ... 0) because bubble sort no longer needs to compare with the last elements as they are sorted.

For all this though, it seems a consensus that insertion sort is better in general. Can anyone tell me why?

Edit: I'm primarily interested in the differences in how the algorithms work, not so much their efficiency or asymptotic complexity.

like image 242
Migwell Avatar asked Jun 24 '13 08:06

Migwell


People also ask

Why is insertion sort considered a better algorithm than bubble sort?

Bubble sort always takes one more pass over array to determine if it's sorted. On the other hand, insertion sort not need this -- once last element inserted, algorithm guarantees that array is sorted.

Which sort is better bubble selection or insertion?

Insertion sort is an efficient sorting algorithm than selection and bubble sort? The average case time complexity of the insertion sort is closer to the worst-case time complexity i.e. O(n²). The above pseudo-code sort the array in increasing order.

Which algorithm is better than bubble sort?

Best case complexity is of O(N) while the array is already sorted. Number of swaps reduced than bubble sort. For smaller values of N, insertion sort performs efficiently like other quadratic sorting algorithms.


2 Answers

Insertion Sort

After i iterations the first i elements are ordered.

In each iteration the next element is bubbled through the sorted section until it reaches the right spot:

sorted  | unsorted 1 3 5 8 | 4 6 7 9 2 1 3 4 5 8 | 6 7 9 2 

The 4 is bubbled into the sorted section

Pseudocode:

for i in 1 to n     for j in i downto 2         if array[j - 1] > array[j]             swap(array[j - 1], array[j])         else             break 

Bubble Sort

After i iterations the last i elements are the biggest, and ordered.

In each iteration, sift through the unsorted section to find the maximum.

unsorted  | biggest 3 1 5 4 2 | 6 7 8 9 1 3 4 2 | 5 6 7 8 9 

The 5 is bubbled out of the unsorted section

Pseudocode:

for i in 1 to n     for j in 1 to n - i          if array[j] > array[j + 1]              swap(array[j], array[j + 1]) 

Note that typical implementations terminate early if no swaps are made during one of the iterations of the outer loop (since that means the array is sorted).

Difference

In insertion sort elements are bubbled into the sorted section, while in bubble sort the maximums are bubbled out of the unsorted section.

like image 101
tom Avatar answered Oct 05 '22 22:10

tom


In bubble sort in ith iteration you have n-i-1 inner iterations (n^2)/2 total, but in insertion sort you have maximum i iterations on i'th step, but i/2 on average, as you can stop inner loop earlier, after you found correct position for the current element. So you have (sum from 0 to n) / 2 which is (n^2) / 4 total;

That's why insertion sort is faster than bubble sort.

like image 45
sasha.sochka Avatar answered Oct 05 '22 22:10

sasha.sochka