Нужен пример сортировки "пузырьковым" методом - C (СИ)
Формулировка задачи:
Приведите, пожалуйста, пример простейшей программы на сортировку "пузырьковым" методом.
Решение задачи: «Нужен пример сортировки "пузырьковым" методом»
textual
Листинг программы
- #include "greatest.h"
- void bubble(int* const arr, const unsigned int siz)
- {
- int unsorted = 1;
- while( unsorted ) {
- unsorted = 0;
- unsigned int i = 0;
- while( 1 ) {
- int prev = arr[i];
- if( ++i == siz ) { break; }
- int cur = arr[i];
- if( cur < prev ) {
- arr[i] = prev;
- arr[i - 1] = cur;
- unsorted = 1;
- }
- }
- }
- }
- TEST bubble_1()
- {
- int arr[] = { 1 };
- bubble(arr, sizeof(arr) / sizeof(arr[0]));
- ASSERT_EQ(1, arr[0]);
- PASS();
- }
- TEST bubble_12()
- {
- int arr[] = { 1, 2 };
- bubble(arr, sizeof(arr) / sizeof(arr[0]));
- ASSERT_EQ(1, arr[0]);
- ASSERT_EQ(2, arr[1]);
- PASS();
- }
- TEST bubble_21()
- {
- int arr[] = { 2, 1 };
- bubble(arr, sizeof(arr) / sizeof(arr[0]));
- ASSERT_EQ(1, arr[0]);
- ASSERT_EQ(2, arr[1]);
- PASS();
- }
- TEST bubble_123()
- {
- int arr[] = { 1, 2, 3 };
- bubble(arr, sizeof(arr) / sizeof(arr[0]));
- ASSERT_EQ(1, arr[0]);
- ASSERT_EQ(2, arr[1]);
- ASSERT_EQ(3, arr[2]);
- PASS();
- }
- TEST bubble_132()
- {
- int arr[] = { 1, 3, 2 };
- bubble(arr, sizeof(arr) / sizeof(arr[0]));
- ASSERT_EQ(1, arr[0]);
- ASSERT_EQ(2, arr[1]);
- ASSERT_EQ(3, arr[2]);
- PASS();
- }
- TEST bubble_213()
- {
- int arr[] = { 2, 1, 3 };
- bubble(arr, sizeof(arr) / sizeof(arr[0]));
- ASSERT_EQ(1, arr[0]);
- ASSERT_EQ(2, arr[1]);
- ASSERT_EQ(3, arr[2]);
- PASS();
- }
- TEST bubble_231()
- {
- int arr[] = { 2, 3, 1 };
- bubble(arr, sizeof(arr) / sizeof(arr[0]));
- ASSERT_EQ(1, arr[0]);
- ASSERT_EQ(2, arr[1]);
- ASSERT_EQ(3, arr[2]);
- PASS();
- }
- TEST bubble_312()
- {
- int arr[] = { 3, 1, 2 };
- bubble(arr, sizeof(arr) / sizeof(arr[0]));
- ASSERT_EQ(1, arr[0]);
- ASSERT_EQ(2, arr[1]);
- ASSERT_EQ(3, arr[2]);
- PASS();
- }
- TEST bubble_321()
- {
- int arr[] = { 3, 2, 1 };
- bubble(arr, sizeof(arr) / sizeof(arr[0]));
- ASSERT_EQ(1, arr[0]);
- ASSERT_EQ(2, arr[1]);
- ASSERT_EQ(3, arr[2]);
- PASS();
- }
- SUITE(test_bubble)
- {
- RUN_TEST(bubble_1);
- RUN_TEST(bubble_12);
- RUN_TEST(bubble_21);
- RUN_TEST(bubble_123);
- RUN_TEST(bubble_132);
- RUN_TEST(bubble_213);
- RUN_TEST(bubble_231);
- RUN_TEST(bubble_312);
- RUN_TEST(bubble_321);
- }
- GREATEST_MAIN_DEFS();
- int main(int argc, char **argv) {
- GREATEST_MAIN_BEGIN(); /* command-line arguments, initialization. */
- RUN_SUITE(test_bubble);
- GREATEST_MAIN_END(); /* display results */
- }
Объяснение кода листинга программы
В данном коде реализована сортировка массива методом пузырька
.
Список действий:
- В функции
bubble
инициализируется переменнаяunsorted
значением 1, которая будет использоваться для контроля цикла. - Запускается цикл
while
, который будет выполняться до тех пор, покаunsorted
не станет равным 0. - Внутри цикла
while
создается вложенный циклwhile
, который будет итерироваться до тех пор, пока не будет выполнено одно из двух условий:- Переменная
i
достигнет значенияsiz
, что означает окончание прохода по массиву. - Будет найдена пара элементов, которые необходимо поменять местами (т.е. текущий элемент
cur
меньше предыдущегоprev
).
- Переменная
- Если условие внутри вложенного цикла выполняется, то значения элементов меняются местами, а переменная
unsorted
устанавливается в 1, чтобы выйти из внешнего цикла. - После завершения внешнего цикла, все элементы массива будут отсортированы по возрастанию.
Примеры тестовых случаев:
bubble_1
: сортировка массива{ 1 }
.bubble_12
: сортировка массива{ 1, 2 }
.bubble_213
: сортировка массива{ 2, 1, 3 }
.bubble_312
: сортировка массива{ 3, 1, 2 }
.bubble_321
: сортировка массива{ 3, 2, 1 }
. В основной функцииmain
вызывается функцияGREATEST_MAIN_BEGIN()
, которая инициализирует аргументы командной строки и запускает начало работы программы. Затем вызывается функцияRUN_SUITE(test_bubble)
, которая запускает все тестовые случаи изtest_bubble
. В конце вызывается функцияGREATEST_MAIN_END()
, которая выводит результаты работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д