Write a program that lets the user enter 20 numerical values into an array and then sorts them in ascending order using the bubble sort algorithm.
Solution
The bubble sort algorithm is probably one of the most inefficient sorting algorithms but it is widely used for teaching purposes. The main idea (when asked to sort an array in ascending order) is to repeatedly move the smallest elements of the array to the positions of lowest index. This works as follows: the algorithm iterates through the elements of the array, compares each pair of adjacent elements, and then swaps their contents (if they are in the wrong order). This process is repeated many times until the array is sorted.
For example, let’s try to sort the following array in ascending order.
The lowest value is the value 5. According to the bubble sort algorithm, this value should gradually “bubble” or “rise” to position 0, like bubbles rising in a glass of cola. When the value 5 has been moved into position 0, the next smallest value is the value 8. Now, the value 8 should “bubble” to position 1. Next is the value 12, which should “bubble” to position 2, and so on. This process repeats until all elements are placed in proper position.
But how can this “bubbling” be done using an algorithm? Let’s see the whole process in more detail. For the previous array A of six elements, five passes must be performed.
First Pass
1st Compare
Initially, elements at index positions 4 and 5 are compared. Since the value 12 is less than the value 49, these two elements swap their content.
2nd Compare
Elements at index positions 3 and 4 are compared. Since the value 12 is not less than the value 5, no swapping is done.
3rd Compare
Elements at index positions 2 and 3 are compared. Since the value 5 is less than the value 8, these two elements swap their content.
4th Compare
Elements at index positions 1 and 2 are compared. Since the value 5 is less than the value 25, these two elements swap their content.
5th Compare
Elements at index positions 0 and 1 are compared. Since the value 5 is less than the value 17, these two elements swap their content.
The first pass has been completed but, as you can see, the array has not been sorted yet. The only value that has actually been placed in proper position is the value 5. However, since more passes will follow, there is no need for the value 5 to take part in the subsequent compares. In the pass that follows, one less compare will be performed—that is, four compares.
Second Pass
1st Compare
Elements at index positions 4 and 5 are compared. Since the value 49 is not less than the value 12, no swapping is done.
2nd Compare
Elements at index positions 3 and 4 are compared. Since the value 12 is not less than the value 8, no swapping is done.
3rd Compare
Elements at index positions 2 and 3 are compared. Since the value 8 is less than the value 25, these two elements swap their content.
4th Compare
Elements at index positions 1 and 2 are compared. Since the value 8 is less than the value 17, these two elements swap their content.
The second pass has been completed and the value of 8 has been placed in proper position. However, since more passes will follow, there is no need for the value 8 (nor 5, of course) to take part in the subsequent compares. In the pass that follows, one less compare will be performed—that is, three compares.
Third Pass
1st Compare
Elements at index positions 4 and 5 are compared. Since the value 49 is not less than the value 12, no swapping is done.
2nd Compare
Elements at index positions 3 and 4 are compared. Since the value 12 is less than the value 25, these two elements swap their content.
3rd Compare
Elements at index positions 2 and 3 are compared. Since the value 12 is less than the value 17, these two elements swap their content.
The third pass has been completed and the value of 12 has been placed in proper position. As previously, since more passes will follow there is no need for the value 12 (nor the values 5 and 8, of course) to take part in the subsequent compares. In the pass that follows, one compare less will be performed—that is, two compares.
Fourth Pass
1st Compare
Elements at index positions 4 and 5 are compared. Since the value 49 is not less than the value 25, no swapping is done.
2nd Compare
Elements at index positions 3 and 4 are compared. Since the value 25 is not less than the value 17, no swapping is done.
The fourth pass has been completed and the value 17 has been placed in proper position. As previously, since one last pass will follow, there is no need for the value 17 (nor the values 5, 8, and 12, of course) to take part in the subsequent compares. In the last pass that follows, one compare less will be performed—that is one compare.
Fifth pass
1st Compare
Elements at index positions 4 and 5 are compared. Since the value 49 is not less than the value 12, no swapping is done.
The fifth pass has been completed and the final two values (25 and 49) have been placed in proper position. The bubble sort algorithm has finished and the array is sorted in ascending order!
Now you need a program that can do the whole previous process. Let’s use the “from inner to outer” method. The code fragment that performs the first pass is shown below. Please note that this is the inner (nested) loop control structure.
PHP
Assume variable m
contains the value 1.
for ($n = ELEMENTS - 1; $n >= $m; $n--) { if ($a[$n] < $a[$n - 1]) { $temp = $a[$n]; $a[$n] = $a[$n - 1]; $a[$n - 1] = $temp; } }
Notice: In the first pass, variable
m
must contain the value 1. This assures that at the last iteration, the elements that are compared are those at positions 1 and 0.Notice: The second pass can be performed if you just re-execute the previous code fragment. Variable m, however, needs to contain the value 2. This will ensure that the element at position 0 won’t be compared again. Similarly, for the third pass, the previous code fragment can be re-executed but variable m needs to contain the value 3 for the same reason.
Java
Assume variable m
contains the value 1.
for (n = ELEMENTS - 1; n >= m; n--) { if (a[n] < a[n - 1]) { temp = a[n]; a[n] = a[n - 1]; a[n - 1] = temp; } }
Notice: In the first pass, variable
m
must contain the value 1. This assures that at the last iteration, the elements that are compared are those at positions 1 and 0.Notice: The second pass can be performed if you just re-execute the previous code fragment. Variable
m
, however, needs to contain the value 2. This will ensure that the element at position 0 won’t be compared again. Similarly, for the third pass, the previous code fragment can be re-executed but variablem
needs to contain the value 3 for the same reason.
C++
Assume variable m
contains the value 1.
for (n = ELEMENTS - 1; n >= m; n--) { if (a[n] < a[n - 1]) { temp = a[n]; a[n] = a[n - 1]; a[n - 1] = temp; } }
Notice: In the first pass, variable
m
must contain the value 1. This assures that at the last iteration, the elements that are compared are those at positions 1 and 0.Notice: The second pass can be performed if you just re-execute the previous code fragment. Variable
m
, however, needs to contain the value 2. This will ensure that the element at position 0 won’t be compared again. Similarly, for the third pass, the previous code fragment can be re-executed but variablem
needs to contain the value 3 for the same reason.
C#
Assume variable m
contains the value 1.
for (n = ELEMENTS - 1; n >= m; n--) { if (a[n] < a[n - 1]) { temp = a[n]; a[n] = a[n - 1]; a[n - 1] = temp; } }
Notice: In the first pass, variable
m
must contain the value 1. This assures that at the last iteration, the elements that are compared are those at positions 1 and 0.Notice: The second pass can be performed if you just re-execute the previous code fragment. Variable
m
, however, needs to contain the value 2. This will ensure that the element at position 0 won’t be compared again. Similarly, for the third pass, the previous code fragment can be re-executed but variablem
needs to contain the value 3 for the same reason.
Visual Basic
Assume variable m
contains the value 1.
For n = ELEMENTS - 1 To m Step -1 If a(n) < a(n - 1) Then temp = a(n) a(n) = a(n - 1) a(n - 1) = temp End If Next
Notice: In the first pass, variable
m
must contain the value 1. This assures that at the last iteration, the elements that are compared are those at positions 1 and 0.Notice: The second pass can be performed if you just re-execute the previous code fragment. Variable
m
, however, needs to contain the value 2. This will ensure that the element at position 0 won’t be compared again. Similarly, for the third pass, the previous code fragment can be re-executed but variablem
needs to contain the value 3 for the same reason.
Python
Assume variable m
contains the value 0.
for n in range(ELEMENTS - 1, m, -1): if a[n] < a[n - 1]: a[n], a[n - 1] = a[n - 1], a[n]
Notice: In the first pass, variable
m
must contain the value 0. This assures that at the last iteration, the elements that are compared are those at positions 1 and 0.Notice: The second pass can be performed if you just re-execute the previous code fragment. Variable m, however, needs to contain the value 1. This will ensure that the element at position 0 won’t be compared again. Similarly, for the third pass, the previous code fragment can be re-executed but variable m needs to contain the value 2 for the same reason
The previous code fragment needs to be executed five times (one for each pass), and each time variable
m
must be incremented by 1. The final code fragment that sorts array a
using the bubble sort algorithm is as follows.
PHP
for ($m = 1; $m <= ELEMENTS - 1; $m++) { for ($n = ELEMENTS - 1; $n >= $m; $n--) { if ($a[$n] < $a[$n - 1]) { $temp = $a[$n]; $a[$n] = $a[$n - 1]; $a[$n - 1] = $temp; } } }
Java
for (m = 1; m <= ELEMENTS - 1; m++) { for (n = ELEMENTS - 1; n >= m; n--) { if (a[n] < a[n - 1]) { temp = a[n]; a[n] = a[n - 1]; a[n - 1] = temp; } } }
C++
for (m = 1; m <= ELEMENTS - 1; m++) { for (n = ELEMENTS - 1; n >= m; n--) { if (a[n] < a[n - 1]) { temp = a[n]; a[n] = a[n - 1]; a[n - 1] = temp; } } }
C#
for (m = 1; m <= ELEMENTS - 1; m++) { for (n = ELEMENTS - 1; n >= m; n--) { if (a[n] < a[n - 1]) { temp = a[n]; a[n] = a[n - 1]; a[n - 1] = temp; } } }
Visual Basic
For m = 1 To ELEMENTS - 1 For n = ELEMENTS - 1 To m Step -1 If a(n) < a(n - 1) Then temp = a(n) a(n) = a(n - 1) a(n - 1) = temp End If Next Next
Python
for m in range(ELEMENTS - 1): for n in range(ELEMENTS - 1, m, -1): if a[n] < a[n - 1]: a[n], a[n - 1] = a[n - 1], a[n]
The complete program is as follows.
PHP
<?php define("ELEMENTS", 20); $a = array(); for ($i = 0; $i <= ELEMENTS - 1; $i++) { $a[$i] = trim(fgets(STDIN)); } for ($m = 1; $m <= ELEMENTS - 1; $m++) { for ($n = ELEMENTS - 1; $n >= $m; $n--) { if ($a[$n] < $a[$n - 1]) { $temp = $a[$n]; $a[$n] = $a[$n - 1]; $a[$n - 1] = $temp; } } } for ($i = 0; $i <= ELEMENTS - 1; $i++) { echo $a[$i], "\t"; } ?>
Java
static final int ELEMENTS = 20; public static void main(String[] args) throws java.io.IOException { java.io.BufferedReader cin = new java.io. BufferedReader(new java.io.InputStreamReader(System.in)); int i, m, n; double temp; double[] a = new double[ELEMENTS]; for (i = 0; i <= ELEMENTS - 1; i++) { a[i] = Double.parseDouble(cin.readLine()); } for (m = 1; m <= ELEMENTS - 1; m++) { for (n = ELEMENTS - 1; n >= m; n--) { if (a[n] < a[n - 1]) { temp = a[n]; a[n] = a[n - 1]; a[n - 1] = temp; } } } for (i = 0; i <= ELEMENTS - 1; i++) { System.out.print(a[i] + "\t"); } }
C++
#include <iostream> using namespace std; const int ELEMENTS = 20; int main() { int i, m, n; double temp; double a[ELEMENTS]; for (i = 0; i <= ELEMENTS - 1; i++) { cin >> a[i]; } for (m = 1; m <= ELEMENTS - 1; m++) { for (n = ELEMENTS - 1; n >= m; n--) { if (a[n] < a[n - 1]) { temp = a[n]; a[n] = a[n - 1]; a[n - 1] = temp; } } } for (i = 0; i <= ELEMENTS - 1; i++) { cout << a[i] << "\t"; } return 0; }
C#
const int ELEMENTS = 20; static void Main() { int i, m, n; double temp; double[] a = new double[ELEMENTS]; for (i = 0; i <= ELEMENTS - 1; i++) { a[i] = Double.Parse(Console.ReadLine()); } for (m = 1; m <= ELEMENTS - 1; m++) { for (n = ELEMENTS - 1; n >= m; n--) { if (a[n] < a[n - 1]) { temp = a[n]; a[n] = a[n - 1]; a[n - 1] = temp; } } } for (i = 0; i <= ELEMENTS - 1; i++) { Console.Write(a[i] + "\t"); } Console.ReadKey(); }
Visual Basic
Const ELEMENTS = 20 Sub Main() Dim i, m, n As Integer Dim temp As Double Dim a(ELEMENTS - 1) As Double For i = 0 To ELEMENTS - 1 a(i) = Console.ReadLine() Next For m = 1 To ELEMENTS - 1 For n = ELEMENTS - 1 To m Step -1 If a(n) < a(n - 1) Then temp = a(n) a(n) = a(n - 1) a(n - 1) = temp End If Next Next For i = 0 To ELEMENTS - 1 Console.Write(a(i) & vbTab) Next Console.ReadKey() End Sub
Python
ELEMENTS = 20 a = [None] * ELEMENTS for i in range(ELEMENTS): a[i] = float(input()) for m in range(ELEMENTS - 1): for n in range(ELEMENTS - 1, m, -1): if a[n] < a[n - 1]: a[n], a[n - 1] = a[n - 1], a[n] for i in range(ELEMENTS): print(a[i], end = "\t")
Notice: The bubble sort algorithm is very inefficient. The total number of compares that it performs is , where N is the total number of array elements.
Notice: The total number of swaps depends on the given array. The worst case is when you want to sort in descending order an array that is already sorted in ascending order, or vice versa.