4 Сортировка перемешиванием
Перестановка элементов в сортировке перемешиванием (шейкерная сортировка) выполняется аналогично, как и в пузырьковой сортировке, т. е. два соседних элемента, при необходимости, меняются местами. Пусть массив требуется упорядочить по возрастанию. Обозначим каждый пройденный путь от начала до конца последовательности через Wi, где i – номер пути; а обратный путь (от конца к началу) через -Wj, где j – номер пути. Тогда после выполнения Wi, один из неустановленных элементов будет помещен в позицию справа, как наибольший из еще неотсортированных элементов, а после выполнения -Wj, наименьший из неотсортированных, переместиться в некоторую позицию слева. Так, например, после выполнения W1 в конце массива окажется элемент, имеющий наибольшее значение, а после -W1 в начало отправиться элемент с наименьшим значением [5].
Реализация алгоритма быстрой сортировки на языке С#:
class Sheik_sort
{
public void SheikSort(int[] mas)
{
int b = 0;
int left = 0;
int right = mas.Length - 1;
while (left < right)
{
for (int i = left; i < right; i++)
{
if (mas[i] > mas[i + 1])
{
b = mas[i];
mas[i] = mas[i + 1];
mas[i + 1] = b;
b = i;
}
}
right = b;
if (left >= right) break;
for (int i = right; i > left; i--)
{
if (mas[i - 1] > mas[i])
{
b = mas[i];
mas[i] = mas[i - 1];
mas[i - 1] = b;
b = i;
}
}
left = b;
}
}
}
Рисунок 7 – Реализация программы, которая сортирует по возрастанию массив из 3000 элементов методом сортировки перемешиванием за 38 миллисекунд.
Рисунок 8 – Реализация программы, которая сортирует по убыванию массив из 3000 элементов методом сортировки перемешиванием за 38 миллисекунд.
5 Сортировка выбором
Сортировка выбором – возможно, самый простой в реализации алгоритм сортировки. Как и в большинстве других подобных алгоритмов, в его основе лежит операция сравнения. Сравнивая каждый элемент с каждым, и в случае необходимости производя обмен, метод приводит последовательность к необходимому упорядоченному виду.
Идея алгоритма очень проста. Пусть имеется массив A размером N, тогда сортировка выбором сводится к следующему:
берем первый элемент последовательности A[i], здесь i – номер элемента, для первого i равен 1;
находим минимальный (максимальный) элемент последовательности и запоминаем его номер в переменную key;
если номер первого элемента и номер найденного элемента не совпадают, т. е. если key≠1, тогда два этих элемента обмениваются значениями, иначе никаких манипуляций не происходит;
увеличиваем i на 1 и продолжаем сортировку оставшейся части массива, а именно с элемента с номером 2 по N, так как элемент A[1] уже занимает свою позицию;
С каждым последующим шагом размер подмассива, с которым работает алгоритм, уменьшается на 1, но на способ сортировки это не влияет, он одинаков для каждого шага [5].
Реализация алгоритма сортировки выбором на языке С#:
class Selectsort
{
public void Selection(int[] mas)
{
for (int i = 0; i < mas.Length - 1; i++)
{
int min = i;
for (int j = i + 1; j < mas.Length; j++)
{
if (mas[j] < mas[min])
{
min = j;
}
}
int dummy = mas[i];
mas[i] = mas[min];
mas[min] = dummy;
}
return;
}
}
Рисунок 9 – Реализация программы, которая сортирует по возрастанию массив из 3000 элементов методом сортировки выбором за 26 миллисекунд.
Рисунок 10 – Реализация программы, которая сортирует по возрастанию массив из 3000 элементов методом сортировки выбором за 26 миллисекунд.