Сортировка пузырьком

Сортировка пузырьком – простейший алгоритм сортировки, применяемый чисто для учебных целей. Практического применения этому алгоритму нет, так как он не эффективен, особенно если необходимо отсортировать массив большого размера. К плюсам сортировки пузырьком относится простота реализации алгоритма.

Алгоритм сортировки пузырьком сводится к повторению проходов по элементам сортируемого массива. Проход по элементам массива выполняет внутренний цикл. За каждый проход сравниваются два соседних элемента, и если порядок неверный элементы меняются местами. Внешний цикл будет работать до тех пор, пока массив не будет отсортирован. Таким образом внешний цикл контролирует количество срабатываний внутреннего цикла Когда при очередном проходе по элементам массива не будет совершено ни одной перестановки, то массив будет считаться отсортированным. Чтобы хорошо понять алгоритм, отсортируем методом пузырька массив, к примеру, из 7 чисел (см. Таблица 1).
исходный массив: 3 3 7 1 2 5 0

Таблица 1 — Сортировка пузырьком
№ итерации Элементы массива Перестановки
исх. массив 3 3 7 1 2 5 0
0 3 3 false
1 3 7 false
2 1 7 7>1, true
3 2 7 7>2, true
4 5 7 7>5, true
5 0 7 7>0, true
тек. массив 3 3 1 2 5 0 7
0 3 3 false
1 1 3 3>1, true
2 2 3 3>2, true
3 0 3 3>0, true
4 3 5 false
5 5 7 false
тек. массив 3 1 2 0 3 5 7
0 1 3 3>1, true
1 2 3 3>2, true
2 0 3 3>0, true
3 3 3 false
4 3 5 false
5 5 7 false
тек. массив 1 2 0 3 3 5 7
1 2 false
0 2 2>0, true
2 3 false
3 3 false
3 5 false
5 7 false
тек. массив 1 0 2 3 3 5 7
0 1 1>0, true
1 2 false
2 3 false
3 3 false
3 5 false
5 7 false
конечный массив 0 1 2 3 3 5 7
Конец сортировки

Для того чтобы отсортировать массив хватило пяти запусков внутреннего цикла, for. Запустившись, цикл for срабатывал 6 раз, так как элементов в массиве 7, то итераций (повторений) цикла for должно быть на одно меньше. На каждой итерации сравниваются два соседних элемента массива. Если текущий элемент массива больше следующего, то меняем их местами. Таким образом, пока массив не будет отсортирован, будет запускаться внутренний цикл и выполняться операция сравнения. Обратите внимание на то, что за каждое полное выполнение цикла for как минимум один элемент массива находит своё место. В худшем случае, понадобится n-2 запуска внутреннего цикла, где n – количество элементов массива. Это говорит о том, что сортировка пузырьком крайне не эффективна для больших массивов.

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

// bu_sort.cpp: определяет точку входа для консольного приложения.

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;

void bubbleSort(int *, int); // прототип функции сортировки пузырьком

int main(int argc, char* argv[])
{
    srand(time(NULL));
    setlocale(LC_ALL, "rus");
    cout << "Введите размер массива: ";
    int size_array; // длинна массива
    cin >> size_array;

    int *sorted_array = new int [size_array]; // одномерный динамический массив
    for (int counter = 0; counter < size_array; counter++)
    {
        sorted_array[counter] = rand() % 100; // заполняем массив случайными числами
        cout << setw(2) << sorted_array[counter] << "  "; // вывод массива на экран
    }
    cout << "\n\n";

    bubbleSort(sorted_array, size_array); // вызов функции сортировки пузырьком

    for (int counter = 0; counter < size_array; counter++)
    {
        cout << setw(2) << sorted_array[counter] << "  "; // печать отсортированного массива
    }
    cout << "\n";

    system("pause");
    return 0;
}

void bubbleSort(int* arrayPtr, int length_array) // сортировка пузырьком
{ 
 int temp = 0; // временная переменная для хранения элемента массива
 bool exit = false; // болевая переменная для выхода из цикла, если массив отсортирован

 while (!exit) // пока массив не отсортирован
 {
  exit = true; 
  for (int int_counter = 0; int_counter < (length_array - 1); int_counter++) // внутренний цикл
    //сортировка пузырьком по возрастанию - знак >
    //сортировка пузырьком по убыванию - знак <
    if (arrayPtr[int_counter] > arrayPtr[int_counter + 1]) // сравниваем два соседних элемента
    {
     // выполняем перестановку элементов массива
     temp = arrayPtr[int_counter]; 
     arrayPtr[int_counter] = arrayPtr[int_counter + 1];
     arrayPtr[int_counter + 1] = temp;
     exit = false; // на очередной итерации была произведена перестановка элементов
    }
 }
}

Результат работы программы показан на рисунке 1.

Сортировка пузырьком

Рисунок 1 — Сортировка пузырьком

Автор: admin
Дата: 26.08.2012
Поделиться:

Комментарии

  1. Станислав Букловский

    Специально для новичков. Статический одномерный массив, просто суть алгоритма. А кто хочет, думаю сможет поставить это на круглые колеса) Если вдруг код очень кривой, то не бейте=) Но все работает
    
    
    ///////////////////////////////////
    //Name: Buble Sort            /////
    //Author:Stanislaw Buklovskiy////
    ///////////////////////////////////
    
    
    
    #include <conio.h>
    #include <iostream>
    #include <iomanip>
    
    
    using namespace std;
    
    
    int main()
    {
    	setlocale(LC_ALL, "Russian");
    
    	//зашиваем размерность массива
    	const int size = 5; 
    
    	//флаг для выхода из сортировки
    	bool flag = false; 
    
    	//создание массива 
    	double mass[size];
    
    	cout<<"\nВведите "<< size <<" элементов массива:\n";
    
    	for(int i = 0; i < size; i++)
    	{
    		cout<<"A [ "<< i <<" ]= ";
    		cin>>mass[i];
    	}
    
    	//вывод неотсортированного массива
    	cout<<"\n\nВведенный массив:\n\n";
    
    	for(int i = 0; i < size; i++)
    		//setw - установка расстояния между элементами массива в выводу( и именно для него iomanip )
    		cout<<setw(4)<<mass[i];
    		
    	while(!flag)
    	{
    		flag = true;
    
    		for(int i = 0; i < size-1; i++)
    			//по возрастанию - знак > , по убыванию - знак <
    			if(mass[i] > mass[i+1])
    			{
    				//выполняем перестановку соседних элементов c помощью функции swap(а то с буфером как-то моветон)
    				swap(mass[i],mass[i + 1]);
    
    				flag = false;
    			}
    	}
    
    	//вывод отсортированного массива 
    	cout<<"\n\nОтсортированный массив:\n\n";
    
    	for(int i = 0; i < size; i++)
    		cout<<setw(4)<<mass[i];
    
    	_getch();
    	return 0;
    }
  2. Станислав Букловский

    Хм.. Что то не видно возвращения памяти в кучу. Память выделяем и не освобождаем…..

  3. TonyVCLCSA .

    Мне одному кажется, что для новичков можно было бы код не так мудрено оформить? Главное же обьяснить суть алгоритма. А так приходит человек, видит setlocale, функция bubblesort, создание динамического массива. Кто-то в комметариях шаблоны использует и подключает другие библиотеки. Да он просто закроет страницу и разбираться не станет.

  4. blablabla

    по моему в строках 53-55 не хватает переменной

  5. Spectrum

    Spectrum

    На данном этапе происходит сравнение текущего элемента и последующего,если же выражение верно,то происходит обмен местами элементов.

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.