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

ОГЛАВЛЕНИЕ

Самая простая сортировка (так называемый "пузырек").  Отсортируем с ее помощью массив:

17 9 6 14 19 5

Проходим от первого элемента до последнего и сравниваем соседние элементы. Если слева больше, то меняем их местами (таким образом, справа всегда будет больший). После такого преобразования будет такое :
9 6 14 17 5 | 19 - 19 уже отсортировано, теперь можно проходить не до конца, а на один элемент меньше.

После второй операции :
6 9 14 5 | 17 19 - Потом :
6 9 5 | 14 17 19
6 5 | 9 14 17 19
5 | 6 9 14 17 19
Вот и все. Исходный код сортировки приведен ниже.

#include <iostream>
using namespace std;

// наш массив
int array[100];

// сортировка
void Sort(int col)
{
// временная переменная для хранения промежуточного результата
int trash=0;

// пока не равно количеству елементов
for (int i=1; i<=col ; i++)
{
// пока не равно col-i
for (int j=1; j<=col-i; j++)
{
// если левый элемент больше
if (array [j]>array [j+1])
{
// правого, то меняем их местами
trash=array[j];
array [j]=array [j+1];
array [j+1]=trash;
}
}
}
}

// вывод на экран нашего массива после сортировки
void Out(int col)
{
for (int i=1; i<=col; i++)
cout << array [i] <<" ";
cout << endl;
}

int main()
{
int col_el;

cout << " Enter length of array"<< endl;
// считываем количество элементов
cin >> col_el;
// считываем элементы массива
for (int n=1; n<=col_el ; n++)
cin >> array[n];

Sort(col_el);
// сортируем их
cout << "Result is :"<<endl;
// и выводим
Out(col_el);
// ждем нажатия клавиши
cin >> col_el;

return 0;
}

Данная программа не доделана до конца, в частности нет проверки на выход за пределы массива и прочее.  Заводим массив на 200 элементов, затем считываем количество элементов вызываем процедуру сортировки.


Упрощение алгоритма сортировки пузырьком

Это можно упростить до следующего вида:

#include <iostream>

using namespace std;

int array[200];

// сортировка
void Sort(int col)
{
int trash=0;
bool f=true;
for (int i=1; (i<=col) && (f=true) ; i++)
{
f=
false;
for (int j=1; j<=col-i; j++)
{
if (array [j]>array [j+1])
{
trash=array[j];
array [j]=array [j+1];
array [j+1]=trash;
f=
true;
}
}
}
}

// вывод
void Out(int col)
{
for (int i=1; i<=col; i++)
cout << array [i] <<" ";
cout << endl;
}

// главная
int main()
{
int col_el;

// ввод данных
cout << " Enter length of array"<< endl;
cin >> col_el;
for (int n=1; n<=col_el ; n++)
cin >> array[n];
   // сортировка
Sort(col_el);

// вывод
cout << "Result is :"<<endl;
Out(col_el);
cin >> col_el;

return 0;
}
Суть упрощения заключается в том, что используется дополнительная булева переменная F. При каждом заходе в первый цикл ей присваивается значение false и, если в процессе выполнения один из элементов будет не отсортирован, то значение этой переменной меняется на true и первый цикл продолжается дальше. В противном случае, если значение не поменялось, то это значит, что уже нечего сортировать.

Данная сортировка выполняет n*(n-1)*(n-2)*...*(2)*(1) операций (в худшем случае).