Angel Pons | ebda03e | 2020-04-02 23:48:05 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Werner Zeh | bd660e2 | 2019-02-19 13:34:12 +0100 | [diff] [blame] | 2 | |
| 3 | #include <commonlib/helpers.h> |
| 4 | #include <commonlib/sort.h> |
| 5 | |
| 6 | /* Implement a simple Bubble sort algorithm. Reduce the needed number of |
| 7 | iterations by taking care of already sorted entries in the list. */ |
| 8 | void bubblesort(int *v, size_t num_entries, sort_order_t order) |
| 9 | { |
| 10 | size_t i, j; |
| 11 | int swapped; |
| 12 | |
Werner Zeh | 1115f63 | 2019-03-12 07:11:11 +0100 | [diff] [blame] | 13 | /* Make sure there are at least two entries to sort. */ |
| 14 | if (num_entries < 2) |
| 15 | return; |
| 16 | |
Werner Zeh | bd660e2 | 2019-02-19 13:34:12 +0100 | [diff] [blame] | 17 | for (j = 0; j < num_entries - 1; j++) { |
| 18 | swapped = 0; |
| 19 | for (i = 0; i < num_entries - j - 1; i++) { |
| 20 | switch (order) { |
| 21 | case NUM_ASCENDING: |
| 22 | if (v[i] > v[i + 1]) { |
| 23 | SWAP(v[i], v[i + 1]); |
| 24 | swapped = 1; |
| 25 | } |
| 26 | break; |
| 27 | case NUM_DESCENDING: |
| 28 | if (v[i] < v[i + 1]) { |
| 29 | SWAP(v[i], v[i + 1]); |
| 30 | swapped = 1; |
| 31 | } |
| 32 | break; |
| 33 | default: |
| 34 | return; |
| 35 | } |
| 36 | } |
| 37 | if (!swapped) |
| 38 | break; |
| 39 | } |
| 40 | } |