Сортировка вставками — достаточно простой алгоритм. Как в и любом другом алгоритме сортировки, с увеличением размера сортируемого массива увеличивается и время сортировки. Основным преимуществом алгоритма сортировки вставками является возможность сортировать массив по мере его получения.То есть имея часть массива, можно начинать его сортировать. В параллельном программирование такая особенность играет не маловажную роль.
Сортируемый массив можно разделить на две части — отсортированная часть и неотсортированная. В начале сортировки первый элемент массива считается отсортированным, все остальные — не отсортированные. Начиная со второго элемента массива и заканчивая последним, алгоритм вставляет неотсортированный элемент массива в нужную позицию в отсортированной части массива. Таким образом, за один шаг сортировки отсортированная часть массива увеличивается на один элемент, а неотсортированная часть массива уменьшается на один элемент. Рассмотрим пример сортировки по возрастанию массива из 7 чисел (см. Таблица 1):
исходный массив: 3 3 7 1 2 5 0
шаг | отсортированная часть массива | тек. элемент | вставка | ||||||
---|---|---|---|---|---|---|---|---|---|
1 | 3 | 3 | false | ||||||
2 | 3 | 3 | 7 | false | |||||
3 | 3 | 3 | 7 | 1 | true | ||||
4 | 1 | 3 | 3 | 7 | 2 | true | |||
5 | 1 | 2 | 3 | 3 | 7 | 5 | true | ||
6 | 1 | 2 | 3 | 3 | 5 | 7 | 0 | true | |
— | 0 | 1 | 2 | 3 | 3 | 5 | 7 | — | — |
На каждом шаге сортировки сравнивается текущий элемент со всеми элементами в отсортированной части. На первом шаге сравнивается тройка с тройкой, они равны поэтому не меняем их местами. На втором шаге сравниваем 7 с двумя тройками, 7 > 3 а так как сортировка по возрастанию, то опять элементы массива остаются на своих местах. На третьем шаге единица сравнивается с тремя элементами и все они больше единицы, значит единицу вставляем на первое место, в начало массива. На четвёртом шаге текущий элемент — 2 сравниваем с элементами 1, 3, 3, 7. Получается, что 1 < 2 < 3 и 7 поэтому двойку вставляем между единицей и тройкой. Пятый и шестой шаги выполняются точно также. В итоге на шестом шагу мы получаем отсортированный по возрастанию массив. Запрограммируем алгоритм сортировки вставками на С++.
// insertion_sort.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> #include <ctime> #include <iomanip> using namespace std; void insertionSort(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"; insertionSort(sorted_array, size_array); // вызов функции сортировки вставками for (int counter = 0; counter < size_array; counter++) { cout << setw(2) << sorted_array[counter] << " "; // печать отсортированного массива } cout << "n"; delete [] sorted_array; // высвобождаем память system("pause"); return 0; } void insertionSort(int *arrayPtr, int length) // сортировка вставками { int temp, // временная переменная для хранения значения элемента сортируемого массива item; // индекс предыдущего элемента for (int counter = 1; counter < length; counter++) { temp = arrayPtr[counter]; // инициализируем временную переменную текущим значением элемента массива item = counter-1; // запоминаем индекс предыдущего элемента массива while(item >= 0 && arrayPtr[item] > temp) // пока индекс не равен 0 и предыдущий элемент массива больше текущего { arrayPtr[item + 1] = arrayPtr[item]; // перестановка элементов массива arrayPtr[item] = temp; item--; } } }
Программа сортирует одномерный массив по возрастанию. Изменив знак > в строке 47 массив будет сортироваться по убыванию. Результат работы программы показан на рисунке 1.
Рисунок 1 — Сортировка вставками
Комментарии
абырвалг
только ‘\n’ вместо «n» :-)