| /* |
| * This file is part of the coreboot project. |
| * |
| * Copyright (C) 2019 Siemens AG |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; version 2 of the License. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #include <commonlib/helpers.h> |
| #include <commonlib/sort.h> |
| |
| /* Implement a simple Bubble sort algorithm. Reduce the needed number of |
| iterations by taking care of already sorted entries in the list. */ |
| void bubblesort(int *v, size_t num_entries, sort_order_t order) |
| { |
| size_t i, j; |
| int swapped; |
| |
| /* Make sure there are at least two entries to sort. */ |
| if (num_entries < 2) |
| return; |
| |
| for (j = 0; j < num_entries - 1; j++) { |
| swapped = 0; |
| for (i = 0; i < num_entries - j - 1; i++) { |
| switch (order) { |
| case NUM_ASCENDING: |
| if (v[i] > v[i + 1]) { |
| SWAP(v[i], v[i + 1]); |
| swapped = 1; |
| } |
| break; |
| case NUM_DESCENDING: |
| if (v[i] < v[i + 1]) { |
| SWAP(v[i], v[i + 1]); |
| swapped = 1; |
| } |
| break; |
| default: |
| return; |
| } |
| } |
| if (!swapped) |
| break; |
| } |
| } |