Нужен пример сортировки "пузырьковым" методом - 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 */
}

Объяснение кода листинга программы

В данном коде реализована сортировка массива методом пузырька. Список действий:

  1. В функции bubble инициализируется переменная unsorted значением 1, которая будет использоваться для контроля цикла.
  2. Запускается цикл while, который будет выполняться до тех пор, пока unsorted не станет равным 0.
  3. Внутри цикла while создается вложенный цикл while, который будет итерироваться до тех пор, пока не будет выполнено одно из двух условий:
    • Переменная i достигнет значения siz, что означает окончание прохода по массиву.
    • Будет найдена пара элементов, которые необходимо поменять местами (т.е. текущий элемент cur меньше предыдущего prev).
  4. Если условие внутри вложенного цикла выполняется, то значения элементов меняются местами, а переменная unsorted устанавливается в 1, чтобы выйти из внешнего цикла.
  5. После завершения внешнего цикла, все элементы массива будут отсортированы по возрастанию. Примеры тестовых случаев:
    • 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(), которая выводит результаты работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5