Среда, 08.01.2025, 20:12
Главная Регистрация RSS поиск
Приветствую Вас, Гость
Меню сайта
Категории раздела
HTML [44]
Visual C++ и MFC [21]
c++ [78]
php [19]
Javascript [15]
C# [51]
загрузки [0]
XNA [10]
создание игр с помощью xna
Наш опрос
Каким языком программирования вы увлекаетесь
Всего ответов: 2420
Статистика

Онлайн всего: 2
Гостей: 2
Пользователей: 0
Реклама
Главная » Статьи » c++

"Пузырьковая" cортировка

"Пузырьковая" cортировка

Программа сортирует значения массива следующим образом: сначала она сравнивает элементы массива a[0] и а[1], меняя местами их значения, если они не упорядочены, затем проделывает то же самое с элементами а[1] и а[2], а[2] и а[3] и т.д.. При выполнении этой последовательности операций элементы с большим значанием будут продвигаться вправо, и на самом деле элемент с наибольшим значением займет положение а[7]. При многократном выполнении этого процесса соответствующие элементы попадут в позиции а[6], а[5] и т.д., так что в конце концов все элементы будут упорядочены.

Главное достоинство пузырьковой сортировки заключается в простоте ее программирования. Однако, выполняется она медленно. Это становится очевидным при сортировке больших массивов.

На рисунке представлено действие данной сортировки на восьми числах.

Рисунок - Пузырьковая сортировка


Ряд чисел удобно представить не горизонтально, а вертикально, чтобы элемент а[7] был сверху, а а[0] - снизу. Используемая при сортировке техника, получила название метода пузырька (пузырьковая сортировка ), потому что большие элементы, подобно пузырькам, "всплывают" на соответствующую позицию.

Пример:

Возьмем массив из чисел:

5 2 4 -4 3

Первый проход:

2 4 -4 3 5

Второй проход:

2 -4 3 4 5

Третий проход:

-4 2 3 4 5

Четвертый проход:

-4 2 3 4 5

Массив отсортирован

Реализация алгоритма:

// "Пузырьковая" сортировка

#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <time.h>

template <typename T>
void BSort(T array[] /* Сортируемый массив */, int size /* Размер массива */)
{
 // Флаг сортировки 
 // (false-массив не отсортирован, true-массив отсортирован)
 // Изначально предполагаем оптимистический вариант
 bool flag = true; 
 
 // Переменные циклов
 int i, j;

 // Временная переменная для обмена значений элементов
 T temp;

 // Создаем бесконечный цикл
 for (j = 1; ; j++) 
 {
 // С помощью переменной j не учитываем уже отсортированные элементы
 for(i = 0; i < size - j; i++)
 if (array[i] > array[i + 1]) 
 {
 //выполняем перестановку
 temp = array[i];
 array[i] = array[i + 1];
 array[i + 1] = temp;
 flag = false;
 }
 if(flag) //массив отсортирован?
 break; //да - выход из цикла
 flag = true; //иначе - устанавливаем флаг сортировки
 }
}

// Функция для вывода массива
template <typename T>
void PrintArray(T array[], int size)
{
 // функция setw(n) создает поле для вывода с шириной n символов
 for(int i = 0; i < size; i++)
 {
 if(i % 5 == 0)
 cout << endl;
 cout << setw(15) << array[i];
 }
 cout << endl;
}

// Тестирование
void main()
{
 // Инициализация генератора случайных чисел
 srand(time(0));
 // Размер массивов
 const N = 10;
 
 int i;
 int a[N];
 float b[N];

 // Инициализация массивов случайными числами в диапазоне от -10 до 10
 for(i = 0; i < N; i++)
 {
 a[i] = rand() % 21 - 10;
 b[i] = rand() / (float)32767 * 20 - 10;
 }

 // Вывод массивов
 cout << "Array A:\n";
 PrintArray(a, N); 

 cout << "Array B:\n";
 PrintArray(b, N); 

 // Сортировка массивов
 BSort(a, N);
 BSort(b, N);

 // Вывод отсортированных массивов
 cout << endl;
 cout << "Array A:\n";
 PrintArray(a, N); 

 cout << "Array B:\n";
 PrintArray(b, N); 
}
Категория: c++ | Добавил: slava (29.04.2011)
Просмотров: 4581 | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]