notebook/notes/algorithms/sorting/bubble-sort.md

6.2 KiB

title TARGET DECK FILE TAGS tags
Bubble Sort Obsidian::STEM algorithm::sorting
algorithm
sorting

Overview

Property Value
Best Case \Omega(n^2)
Worst Case O(n^2)
Avg. Case O(n^2)
Aux. Memory O(1)
Stable Yes
Adaptive Yes

!bubble-sort.gif

%%ANKI Basic Describe BUBBLE_SORT in a single sentence. Back: Repeatedly swap the smaller of adjacent records downward. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic What is BUBBLE_SORT's best case runtime? Back: \Omega(n) Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic How is it BUBBLE_SORT achieves best case linear runtime? Back: By terminating when no swaps occurred on a given iteration. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic What input value does BUBBLE_SORT perform best on? Back: An already sorted array. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic What is BUBBLE_SORT's worst case runtime? Back: O(n^2) Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic What input value does BUBBLE_SORT perform worst on? Back: An array in reverse-sorted order. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic What is BUBBLE_SORT's average case runtime? Back: O(n^2) Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic Is BUBBLE_SORT in place? Back: Yes. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic Is BUBBLE_SORT stable? Back: Yes. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic Is BUBBLE_SORT adaptive? Back: Yes. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

void swap(int i, int j, int *A) {
  int tmp = A[i];
  A[i] = A[j];
  A[j] = tmp;
}

void bubble_sort(const int n, int A[static n]) {
  bool swapped = true;
  for (int i = 0; swapped && i < n - 1; ++i) {
    swapped = false;
    for (int j = n - 1; j > i; --j) {
      if (A[j] < A[j - 1]) {
	    swap(j, j - 1, A);
	    swapped = true;
      }
    }
  }
}

%%ANKI Basic What sorting algorithm does the following demonstrate? !bubble-sort.gif Back: BUBBLE_SORT Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

Loop Invariant

Consider loop-invariant P given by

A[0..i-1] is a sorted array of the i least elements of A.

We prove P maintains the requisite properties:

  • Initialization
    • When i = 0, A[0..-1] is an empty array. This trivially satisfies P.
  • Maintenance
    • Suppose P holds for some 0 ≤ i < n - 1. Then A[0..i-1] is a sorted array of the i least elements of A. Our inner loop now starts at the end of the array and swaps each adjacent pair, putting the smaller of the two closer to position i. Repeating this process across all pairs from n - 1 to i + 1 ensures A[i] is the smallest element of A[i..n-1]. Therefore A[0..i] is a sorted array of the i + 1 least elements of A. At the end of the iteration, i is incremented meaning A[0..i-1] still satisfies P.
  • Termination
    • Termination happens when i = n - 1. Then P implies A[0..n-2] is a sorted array of the n - 1 least elements of A. But then A[n-1] must be the greatest element of A meaning A[0..n-1], the entire array, is in sorted order.

%%ANKI Basic Given array A[0..n-1], what is BUBBLE_SORT's loop invariant? Back: A[0..i-1] is a sorted array of the i least elements of A. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic What is initialization of BUBBLE_SORT's loop invariant? Back: Sorting starts with an empty array which is trivially sorted. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic What is maintenance of BUBBLE_SORT's loop invariant? Back: Each iteration puts the next least element into the sorted subarray. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic How does BUBBLE_SORT partition its input array? Back:

[ sorted | unsorted ]

Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Basic Which element will BUBBLE_SORT move to sorted?

[ sorted | unsorted ]

Back: The least element in unsorted. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

%%ANKI Cloze Selection sort makes fewer {swaps} than BUBBLE_SORT in the average case. Reference: Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).

END%%

Bibliography

  • Thomas H. Cormen et al., Introduction to Algorithms, Fourth edition (Cambridge, Massachusett: The MIT Press, 2022).