Консультация № 144936
24.09.2008, 21:21
0.00 руб.
0 3 3
Добрый вечер! Объясните мне пожалуйста как работает метод сортировки пузырьком (кратко и по существу).
Если можно с примером. Заранее спасибо.

Обсуждение

Неизвестный
24.09.2008, 21:47
общий
это ответ
Здравствуйте, Visual Scooby!
есть пузырьки разного размера, расположенные друг на другом.
чем пузырек больше, тем он легче и всплывает над более мелкими собратьями, т.е. если пузырек большего размера оказывается под меньшим - он обменивается с ним местами, так повторяется для всех пар. в результате самые большие оказываются вверху, самые маленькие внизу.
Это самый простой и пожалуй самый медленный способ сортировки.
Реализация в приложении:

Приложение:
#include <iostream>
#include <stdio.h>

void printArray(int* arr, unsigned size)
{
for(unsigned i = 0; i < size; ++i){
if(i != 0)
std::cout << ", ";
std::cout << arr[i];
}
std::cout << std::endl;
}

#define ArraySize 10

void main(int argc, char* argv[])
{
int array[ArraySize];

// заполняем случайными данными
for(unsigned i = 0; i < ArraySize; ++i)
array[i] = rand() % 100;

printArray(array, ArraySize);

for(unsigned j = 1; j < ArraySize - 1; ++j)
for(unsigned i = 0; i < ArraySize - j; ++i) // цикл до ArraySize - j, т.к. после каждой итерации по j на верху уже самый большой
if(array[i] > array[i+1]){ // нижний пузырек больше - меняем местами
int tmp = array[i];
array[i] = array[i+1];
array[i+1] = tmp;
}

printArray(array, ArraySize);
}
Неизвестный
24.09.2008, 22:14
общий
это ответ
Здравствуйте, Visual Scooby!

Вот код, который обеспечивает сортировку массива методом пузырька:

// . . .

for(a = 1; a < razmer; a++)

for(b = razmer - 1; b >= a; b--)
{

if(mas[b - 1] > mas[b])
{
int buffer = mas[b - 1];

mas[b - 1] = mas[b];

mas[b] = buffer;
}
}

// . . .

Здесь выполняются повторяющиеся операции сравнения значений и при этом если нужно обмен их местами.
При этом элементы с меньшими значениями постепенно перемещаются к одному концу массива, а элементы с большими - к другому. Такая сортировка выполняется путем нескольких проходов по массиву и если нужно их перестановки. Количество таких проходов, при котором массив будет гарантировано отсортирован - равно количеству элементов массива минус единица. Например если в массиве 10 элементов, то за 9 проходов массив будет отсортирован. Сама сортировка как видно реализована на двух циклах. Во внутреннем организовано сравнение двух соседних элементов массива. Внешний цикл обеспечивает повторение сравнений и перестановок (если нужно) пока весь массив не будет отсортирован.

Полный код с комментариями и с примером реализации пузырьковой сортировки в приложении.

Удачи!!!

Приложение:
//Подключаем заголовок потокового ввода/вывода
#include <iostream>

using namespace std;

int main ()
{
//Объявляем массив целых чисел на 100 элементов;
int mas[100];

//Объявляем переменную размерности
int razmer = 0, a = 0, b = 0;

//Приглашение ввести размерность массива
cout << endl << " Vvedyte razmernost' massyva: ";

//Ввод значения размерности массива
cin >> razmer;

cout << endl;

//Цикл для обеспечения ввода элементов массива
for(int i = 0; i < razmer; i++)
{
cout << " mas[" << i << "]: ";

cin >> mas[i];
}

cout << endl << " Yshodnyy massyv: " << endl << endl;

//Цикл для вывода на экран исходного массива
for(int i = 0; i < razmer; i++)
{
cout << " " << mas[i];
}

cout << endl;

for(a = 1; a < razmer; a++)

for(b = razmer - 1; b >= a; b--)
{
//Если соседние значения расположены не по пороядку,
if(mas[b - 1] > mas[b])
{
//то меняем их местами
int buffer = mas[b - 1];

mas[b - 1] = mas[b];

mas[b] = buffer;
}
}

//Цикл для вывода на экран исходного массива
cout << endl << " Otsortyrovannyy massyv: " << endl << endl;

for(int i = 0; i < razmer; i++)
{
cout << " " << mas[i];
}

cout << endl << endl;

return 0;
}
Неизвестный
25.09.2008, 08:14
общий
это ответ
Здравствуйте, Visual Scooby!
Метод сортировки массива пузырьком описан в четырех предложениях здесь: http://algolist.manual.ru/sort/bubble_sort.php
Кроме того, там есть описания его модификаций. Рекомендую посмотреть.

Форма ответа