Нужен пример сортировки "пузырьковым" методом - 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(), которая выводит результаты работы программы.