Вам понадобится внутренний цикл в пузырьковой сортировке, который отвечает за перемещение самого большого элемента назад и выполнение перестановок i
раз (эти большие элементы "пузырятся").Начните внутренний цикл в 0
на каждой итерации и итерируйте до size - i
(мы знаем, что последние i
элементы отсортированы и находятся в их конечных позициях).
i
контролирует ваш внешний цикл идолжен быть увеличен в конце цикла (так же, как если бы вы использовали цикл for
).j
управляет внутренним циклом и должно увеличиваться в конце цикла.
Пока вы работаете, неплохо было бы убрать печать из функции сортировки, что вызывает ненужные побочный эффект и может расстроить ваши усилия по отладке.
Также стоит отметить, что (1) for
циклы здесь более семантически уместны и (2) есть оптимизация, доступная путем добавленияboolean - как только вы пройдете через внутренний цикл, который не выполняет перестановок, закончите рано!
#include <stdio.h>
void ft_sort_integer_table(int *tab, int size)
{
int i = 0, j, tem;
while (i < size)
{
j = 0;
while (j < size - i)
{
if (tab[j] > tab[j+1])
{
tem = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tem;
}
j++;
}
i++;
}
}
int main(void)
{
int tab[] = {1,3,2,5,4,6,7,1,5,6,8,9,1,4,5,1,2};
int size = sizeof(tab) / sizeof(*tab);
ft_sort_integer_table(tab, size);
for (int i = 0; i < size; i++)
{
printf("%d ", tab[i]);
}
return(0);
}
Вывод:
1 1 1 1 2 2 3 4 4 5 5 5 6 6 7 8 9
Попробуйте!