АлгоритмыАлгоритмы сортировок. Часть 1


Наверное, большинство программистов скажут, что первый алгоритм, с которым они познакомились, был алгоритм сортировки. Пузырьковую сортировку наверное во всех ВУЗ-ах по программированию приводят в качестве примера сортировки.
Поэтому я решил описать самые популярные алгоритмы сортировок.

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

Сортировка пузырьком, как и сортировка выбором сравнительно неэффективная. Их примерное время работы равно О(n^2), где n — количество элементов массива.
Этот метод сортировки характеризуется очень простым кодом и алгоритмом. Приведу пошагово работу пузырьковой сортировки:
5 4 3 2 1   // начальная последовательность
4 5 3 2 1
4 3 5 2 1
4 3 2 5 1
4 3 2 1 5
3 4 2 1 5
3 2 4 1 5
3 2 1 4 5
2 3 1 4 5
2 1 3 4 5
1 2 3 4 5   // результат

Сортировка пузырьком «пробегает» начиная с первого элемента по массиву до конца. При этом каждый элемент сравнивается с следующим. И если следующий элемент меньше, меняет их местами. Данные операции продолжаются до тех пор, пока наименьший элемент не станет первым в массиве. Потом начинаем те же операции со второго элемента, третьего и так до конца.

Аналогичную сортировку можно проделать, когда наибольший элемент будет «всплывать», а наименьший «тонуть», то есть наоборот.
Реализация алгоритма:
#include <iostream>
#include <cstdlib>
using namespace std;

const int SIZE = 25;
int array[SIZE];

// заполнение массива случайными числами
void GenerationArray()
{
 
// привязка ко времени для генерации чисел без повторений
  srand
(time(0));

 
for (int i=0; i<SIZE; i++)
 
{
   
// заполнение массива числами < 100
    array
[i] = rand()%100;
 
}
}

// вывод массива на экран
void ShowArray()
{
 
for (int i=0; i<SIZE; i++)
 
{
    cout
<< array[i] << " ";
 
}

  cout
<< endl;
}

int main()
{
 
int temp;

 
GenerationArray();
 
ShowArray();

 
// сортировка пузырьком
 
for (int x=SIZE; x>0; x--)
 
{
   
for (int i=0; i<SIZE-1; i++)
   
{
     
// если число больше за следующее
     
if (array[i] > array[i+1])
     
{
       
// меняем их местами
        temp
= array[i];
        array
[i] = array[i+1];
        array
[i+1] = temp;
     
}
   
}
 
}

 
ShowArray();

 
return 0;
}

Сортировка выбором

Главной проблемой пузырьковой сортировки является количество перестановок элементов. В выборочной сортировке эта проблема устранена. Здесь элемент сразу занимает свою конечную позицию.

И, опять же, пошаговая работа сортировки:
5 4 6 9 3 2 1 7 8   // начальная последовательность
1 4 6 9 3 2 5 7 8
1 2 6 9 3 4 5 7 8
1 2 3 9 6 4 5 7 8
1 2 3 4 6 9 5 7 8
1 2 3 4 5 9 6 7 8
1 2 3 4 5 6 9 7 8
1 2 3 4 5 6 7 9 8
1 2 3 4 5 6 7 8 9   // результат

Реализация алгоритма:
#include <iostream>
#include <cstdlib>
using namespace std;

const int SIZE = 25;
int array[SIZE];

// заполнение массива случайными числами
void GenerationArray()
{
 
// привязка ко времени для генерации чисел без повторений
  srand
(time(0));

 
for (int i=0; i<SIZE; i++)
 
{
   
// заполнение массива числами < 100
    array
[i] = rand()%100;
 
}
}

// вывод массива на экран
void ShowArray()
{
 
for (int i=0; i<SIZE; i++)
 
{
    cout
<< array[i] << " ";
 
}

  cout
<< endl;
}

int main()
{
 
int temp, start = 0, min_position, min_element;

 
GenerationArray();
 
ShowArray();

 
// сортировка выбором
 
while (start != SIZE-1)
 
{
   
// предположим, что элемент с индексом левой границы минимален
    min_element
= array[start];
   
// запоминаем индекс этого элемента
    min_position
= start;

   
// ищем минимальный элемент в подмассиве
   
for (int i=start+1; i<SIZE; i++)
   
{
     
if (array[i] < min_element)
     
{
        min_element
= array[i];
        min_position
= i;
     
}
   
}

   
// если элемент с индексом левой границы не минимален,
   
// меняем его местами с найденным минимальным числом
   
if (min_position != start)
   
{
      temp
= array[start];
      array
[start] = array[min_position];
      array
[min_position] = temp;
   
}

    start
++;
 
}

 
ShowArray();

 
return 0;
}

Время сортировки 100 тысяч элементов пузырьковой сортировкой составила 1 минута 38.731 секунд, в то время как сортировка выбором справилась с этим заданием за 28.313 секунд. Но все равно оба алгоритма не подходят для сортирования больших массивов чисел. При увеличении числа элементов в 10 раз, количество циклов будет возрастать в 100(!) раз. Для таких объемов чисел существуют другие алгоритмы сортировки, о которых мы узнаем в следующей серии нашей передачи ;)
  • +4
  • eReS
  • 06 января 2011, 23:38

Комментарии (2)

В сортировке выбором строку:
for (int i=start; i<SIZE; i++)

можно чуть подправить:
for (int i=start+1; i<SIZE; i++)

т.к. получается, что первый элемент сравнивается сам с собой.

исправил :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.