note · algorithms

Bubble Sort

Bubble Sort

  • Iterate through the array elements one by one, and check if one is greater than the other.
  • If yes, swap the two elements
  • After every run, it is guranteed that the last element will be sorted. We can slowly make the range smller by 1 element each time, hence j < len(slice)-i-1
  • Optimized: If no elements were swapped after the first iteration, that means no element is out of order. We can stop sorting.

Complexities

Time Complexity

O(N) Best case - When elements are already sorted

O(N^2) On average - Total number of comparisons = n(n-1)/2

O(N^2) Worst case - When array is reversed sorted

Space Complexity

O(1)

Implementation

func bubbleSort(slice []int) {
	for i := 0; i < len(slice); i++ {
		for j := 0; j < len(slice)-i-1; j++ {
			if slice[j] > slice[j+1] {
				tmp := slice[j+1]
				slice[j+1] = slice[j]
				slice[j] = tmp
			}
		}
	}
}

func bubbleSortOptimized(slice []int) {
	swapped := false
	for i := 0; i < len(slice); i++ {
		for j := 0; j < len(slice)-i-1; j++ {
			if slice[j] > slice[j+1] {
				tmp := slice[j+1]
				slice[j+1] = slice[j]
				slice[j] = tmp
				swapped = true
			}
			if !swapped {
				break
			}
		}
	}
}

func main(){
    b := []int{33, 1, 5, 8, 22, 1, 55, 5, 99, 123, 90, 456, 333, 890, 1000, 999}
	fmt.Println("Before:", b)
	bubbleSort(b)
	fmt.Println("After:", b)

	c := []int{33, 1, 5, 8, 22, 1, 55, 5, 99, 123, 90, 456, 333, 890, 1000, 999}
	fmt.Println("Before:", c)
	bubbleSortOptimized(c)
	fmt.Println("After:", c)
}
Back toAll notes