#include <stdio.h>
int bubble_sort_pass(int array[], int size)
{
/* We return the number of swaps in this iteration. */
int swaps = 0;
/* If the array contains 0 or 1 elements, it is already sorted. */
if (size < 2) {
return swaps;
}
/* Array contains at least 2 elements. */
if (array[0] > array[1]) {
/* First two elements are in wrong order. We need to swap them. */
printf("Swap value %d with value %d\n", array[0], array[1]);
int temp = array[0];
array[0] = array[1];
array[1] = temp;
swaps += 1;
}
/* Recursively bubble sort the array starting at the 2nd element. */
swaps += bubble_sort_pass(array + 1, size - 1);
return swaps;
}
void bubble_sort(int array[], int size)
{
/* Do one pass of bubble sorting the entire array. */
printf("Start a bubble sort pass.\n");
int swaps = bubble_sort_pass(array, size);
/* If there was at least one swap, we have to do another pass. */
if (swaps >= 1) {
bubble_sort(array, size);
}
}
int main()
{
int numbers[] = {10, 8, 3, 7, 2, 1, 4, 6, 5, 9};
int count = sizeof(numbers) / sizeof(numbers[0]);
bubble_sort(numbers, count);
for(int i=0; i<count; ++i) {
printf("numbers[%d] = %d\n", i, numbers[i]);
}
return 0;
}
В C вы бы обычно не реализовали сортировку пузырьками таким образом; вместо этого вы бы использовали итеративный подход (т.е. циклы).
Эта рекурсивная реализация предназначена исключительно для учебных целей. Некоторые так называемые «чисто функциональные» языки не имеют циклов, они имеют только рекурсию. Одним из таких языков является Erlang.
Обратите внимание, что рекурсивный вызов bubble_sort является последним оператором в bubble_sort. Это называется «хвостовой рекурсией» и позволяет компилятору оптимизировать проталкивание адреса возврата в стек. C компилятор (скорее всего) не будет выполнять такую оптимизацию хвостовой рекурсии, но функциональный компилятор (например, компилятор Erlang) сделает это.
Рекурсивный вызов bubble_sort_pass в bubble_sort_pass в настоящее время не является вызовом хвостовой рекурсии, но его можно легко превратить в вызов рекурсии хвоста (убедитесь сами!)