В статье рассмотрены одни из самых популярных алгоритмов сортировки для массивов, применшаблоняемых как практически, так и в учебных целях. Сразу хочу оговориться, что все рассмотренные алгоритмы медленнее, чем метод классической сортировки массива через список значений, но тем не менее, заслуживают внимания. Текста получается много, поэтому по каждому алгоритму описываю самое основное.
1.Алгоритм "Сортировка выбором".
Является одним из самых простых алгоритмов сортировки массива. Смысл в том, чтобы идти по массиву и каждый раз искать минимальный элемент программу 1С массива, обменивая его с начальным элемент программу 1С ом неотсортированной части массива. На небольших массивах может оказаться даже эффективнее, чем более сложные алгоритмы сортировки, но в любом случае проигрывает на больших массивах. Число обменов элемент программу 1С ов по сравнению с "пузырьковым" алгоритмом N/2, где N - число элемент программу 1С ов массива.
Алгоритм:
1. Находим минимальный элемент программу 1С в массиве.
2. Меняем местами минимальный и первый элемент программу 1С местами.
3. Опять ищем минимальный элемент программу 1С в неотсортированной части массива
4. Меняем местами уже второй элемент программу 1С массива и минимальный найденный, потому как первый элемент программу 1С массива является отсортированной частью.
5. Ищем минимальные значения и меняем местами элемент программу 1С ы,пока массив не будет отсортирован до конца.
//Сортировка выбором {---
Функция СортировкаВыбором(Знач Массив)
Мин = 0;
Для i = 0 По Массив.ВГраница() Цикл
Мин = i;
Для j = i + 1 ПО Массив.ВГраница() Цикл //Ищем минимальный элемент программу 1С в массиве
Если Массив[j] < Массив[Мин] Тогда
Мин = j;
Конецплатфорпечатную версиюмаЕсли;
Конецплатфорпечатную версиюмаЦикла;
Если Массив [Мин] = Массив [i] Тогда //Если мин. элемент программу 1С массива = первому элемент программу 1С у неотс. части массива, то пропускаем.
Продолжить;
Конецплатфорпечатную версиюмаЕсли;
Смена = Массив[i]; //Производим замену элемент программу 1С ов массива.
Массив[i] = Массив[Мин];
Массив[Мин] = Смена;
Конецплатфорпечатную версиюмаЦикла;
Возврат управления Массив;
Конецплатфорпечатную версиюмаФункции
2.Алгоритм "Сортировка пузырьком".
Пожалуй самый известный алгоритм, применшаблоняемый в учебных целях, для практического же применшаблонения является слишком медленным. Алгоритм лежит в основе более сложных алгоритмов: "Шейкерная сортировка", "Пирамидальная сортировка", "Быстрая сортировка". Примечательно то, что один из самых быстрых алгоритмов "Быстрый алгоритм" был разработ Тарифы на абонементан путем модернизации одного из самых худших алгоритмов "Сортировки пузырьком"."Быстрая" и "Шейкерная" сортировки будут рассмотрены далее. Смысл алгоритма заключается в том, что самые "легкие" элемент программу 1С ы массива как бы "всплывают" , а самые "тяжелые" "тонут". Отсюда и название "Сортировка пузырьком"
Алгоритм:
1. Каждый элемент программу 1С массива сравнивается с последующим и если элемент программу 1С [i] > элемент программу 1С [i+1] происходит замена. Таким образом самые "легкие" элемент программу 1С ы "всплывают" - перемещаются к началу списка,а самые тяжелые "тонут" - перемещаются к концу.
2. Повторяем Шаг 1 n-1 раз, где n - Массив.Количество ().
//Сортировка пузырьком {---
Функция СортировкаПузырьком(Знач Массив)
Для i = 0 По Массив.ВГраница() Цикл
Для j = 0 ПО Массив.Вграница() - i - 1 Цикл
Если Массив[j] > Массив[j + 1] Тогда
Замена = Массив[j];
Массив[j] = Массив[j + 1];
Массив[j + 1] = Замена;
Конецплатфорпечатную версиюмаЕсли;
Конецплатфорпечатную версиюмаЦикла;
Конецплатфорпечатную версиюмаЦикла;
Возврат управления Массив;
Конецплатфорпечатную версиюмаФункции
//---}
3.Алгоритм "Шейкерная сортировка"(Сортировка перемешиванием,Двунаправленная пузырьковая сортировка).
Алгоритм представляет собой одну из версий предыдущей сортировки - "сортировки пузырьком". Главное отличие в том, что в классической сортировке пузырьком происходит однонаправленное движение элемент программу 1С ов снизу - вверх, то в шейкерной сортировке сначало происходит движение снизу-вверху, а затем сверху-вниз.
Алгоритм такой же, что и у пузырьковой сортировки + добавляется цикл пробега сверху-вниз.
В приведенном ниже примере, есть усовершенствование в шейкерной сортировке. В отличие от классической, используется в 2 раза меньше итераций.
//Сортировка перемешивание (Шейкер-Сортировка) {---
Функция СортировкаПеремешиванием(Знач Массив)
Для i = 0 ПО Массив.ВГраница()/2 Цикл
нИтер = 0;
конИтер = Массив.ВГраница();
Пока нИтер Массив[нИтер+1] Тогда
Замена = Массив[нИтер];
Массив[нИтер] = Массив[нИтер + 1];
Массив[нИтер + 1] = Замена;
Конецплатфорпечатную версиюмаЕсли;
нИтер = нИтер + 1;//Двигаем позицию на шаг вперед
//Проходим с конца
Если Массив[конИтер - 1] > Массив[конИтер] Тогда
Замена = Массив[конИтер - 1];
Массив[конИтер-1] = Массив[конИтер];
Массив[конИтер] = Замена;
Конецплатфорпечатную версиюмаЕсли;
конИтер = конИтер - 1;//Двигаем позицию на шаг назад
Конецплатфорпечатную версиюмаЦикла;
Конецплатфорпечатную версиюмаЦикла;
Возврат управления Массив;
Конецплатфорпечатную версиюмаФункции
//---}
4. Алгоритм "Гномья сортировка".
Алгоритм так странно назван благодаря голландскому ученому Дику Груну.
Гномья сортировка основана на технике, используемой обычным голландским садовым гномом (нидерл. tuinkabouter). Это метод, которым садовый гном сортирует линию цветочных горшков. По существу он смотрит на следующий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперёд, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперёд; если нет следующего горшка, он закончил.
Дик Грун
Вот собственно и все описание алгоритма "Гномья сортировка". Что интересно, алгоритм не содержит вложенных циклов, а сортирует весь массив за один проход.
//Гномья сортировка {---
Функция ГномьяСортировка(Знач Массив)
i = 1;
j = 2;
Пока i < Массив.Количество() Цикл // Сравнение < - Сортировка по возрастанию, > - по убыванию
Если Массив[i-1]
i = j;
j = j + 1;
Иначе
Замена = Массив[i];
Массив[i] = Массив[i - 1];
Массив[i - 1] = Замена;
i = i - 1;
Если i = 0 Тогда
i = j;
j = j + 1;
Конецплатфорпечатную версиюмаЕсли;
Конецплатфорпечатную версиюмаЕсли;
Конецплатфорпечатную версиюмаЦикла;
Возврат управления Массив;
Конецплатфорпечатную версиюмаФункции
//---}
5. Алгоритм "Сортировка вставками".
Представляет собой простой алгоритм сортировки. Смысл заключается в том, что на каждом шаге мы берем элемент программу 1С , ищем для него позицию и вставляем в нужное место.
Элементарный пример: При игре в дурака, вы тянете из колоды карту и вставляете ее в соответствующее место по возрастанию в имеющихся у вас картах. Или
в магазине вам дали сдачу 550 рублей- одна купюра 500, другая 50. Заглядываете в кошелек, а там купюры достоинством 10,100,1000. Вы вставляете купюру
достоинсвом 50р. между купюрами достоинством 10р и 100р, а купюру в 500 рублей между купюрами 100р и 1000р. Получается 10,50,100,500,1000 - Вот вам
и алгоритм "Сортировка вставками".
Таким образом с каждым шагом алгоритма, вам необходимо отсортировать подмассив данных и вставить значение в нужное место.
//Сортировка вставками {---
Функция СортировкаВставками(Знач Массив)
Для i = 0 По Массив.ВГраница()-1 Цикл
Ключ = i + 1;
Замена = Массив[Ключ];
j = i + 1;
Пока j > 0 И Замена < Массив[j - 1] Цикл
Массив[j] = Массив[j - 1];
Замена = j - 1;
Ключ = j - 1;
j = j - 1;
Конецплатфорпечатную версиюмаЦикла;
Массив[Ключ] = Замена;
Конецплатфорпечатную версиюмаЦикла;
Возврат управления Массив;
Конецплатфорпечатную версиюмаФункции
//---}
6. Алгортим "Сортировка слиянием".
Интересный в плане реализации и идеи алгоритм. Смысл его в том, чтобы разбивать массив на подмассивы, пока длина каждого подмассива не будет равна 1. Тогда мы утверждаем, что такой подмассив отсортирован. Затем сливаем получившиеся подмассивы воедино, одновременно сравнивая и сортируя поэлемент программу 1С но значения подмассивов.
p/s не смог вставить сюда рисунок с более наглядной схемой, постоянно размазывается. Зато хорошо видна в блоке скриншотов внизу. Можно посмотреть как работ Тарифы на абонементает алгоритм.
//Сортировка слиянием {---
Функция СортировкаСлиянием(Знач Массив)
Если Массив.Количество() = 1 Тогда
Возврат управления Массив;
Конецплатфорпечатную версиюмаЕсли;
ТочкаРазрыв = Массив.Количество() / 2;
лМассив = Новый Массив;
прМассив = Новый Массив;
Для Сч = 0 ПО Массив.ВГраница() Цикл
Если Сч < ТочкаРазрыв Тогда
лМассив.Добавить(Массив[Сч]);
Иначе
прМассив.Добавить(Массив[Сч]);
Конецплатфорпечатную версиюмаЕсли;
Конецплатфорпечатную версиюмаЦикла;
Возврат управления Слияние(СортировкаСлиянием(лМассив),СортировкаСлиянием(прМассив));
Конецплатфорпечатную версиюмаФункции
Функция Слияние(массив1,массив2)
a = 0;
b = 0;
слМассив = Новый Массив;
Для Сч = 0 ПО (Массив1.Количество() + Массив2.Количество())-1 Цикл
слМассив.Добавить();
Конецплатфорпечатную версиюмаЦикла;
Для i = 0 ПО (массив1.Количество() + массив2.Количество())-1 Цикл
Если b < массив2.Количество() И a < массив1.Количество() Тогда
Если (массив1[a] > массив2[b]) И (b < массив2.Количество()) Тогда
слМассив[i] = массив2[b];
b = b + 1;
Иначе
слМассив[i] = массив1[a];
a = a + 1;
Конецплатфорпечатную версиюмаЕсли;
Иначе
Если b < массив2.количество() Тогда
слМассив[i] = массив2[b];
b = b + 1;
Иначе
слМассив[i] = массив1[a];
a = a + 1;
Конецплатфорпечатную версиюмаЕсли;
Конецплатфорпечатную версиюмаЕсли;
Конецплатфорпечатную версиюмаЦикла;
Возврат управления слМассив;
Конецплатфорпечатную версиюмаФункции
//---}
7. Алгортим "Сортировка Шелла".
Алгоритм назван так в честь американского ученого Дональда Шелла. По своей сути этот алгоритм является усовершенствованным алгоритмом "Сортировка вставками". Смысл алгоритма заключается в том, чтобы сравнивать не только элемент программу 1С ы, стоящие рядом друг с другом, но и на некотором удалении. Сначало выбирается Шаг - некий промежуток, через который будут сравниваться элемент программу 1С ы массива на каждой итерации. Обычно его определяют так:
Для первой итерации Шаг = Цел(Массив.Количество()/2), для последующих Шаг = Цел(Шаг/2). Т.е. постепенно шаг сокращается и когда Шаг будет равен 1 произойдет последние сравнение и массив будет отсортирован.
Пример:
Дан массив (10,5,3,1,14,2,7,12).
1. Шаг = 4.
Сортируем простыми вставками каждые 4 группы по 2 элемент программу 1С а (10,14)(5,2)(3,7)(1,12)
10,2,3,1,14,5,7,12
2. Шаг = 2
Сортируем простыми вставками каждые 2 группы по 4 элемент программу 1С а (10,3,14,7)(2,1,5,12)
3,1,7,2,10,5,14,12
3. Шаг = 1
Сортируем простыми вставками каждую 1 группу по 8 элемент программу 1С ов.
1,2,3,5,7,10,12,14
//Сортировка Шелла {---
Функция СортировкаШелла(Знач Массив)
Шаг = Цел(Массив.Количество()/2);
Пока Шаг > 0 Цикл
i = 0;
Пока i < (Массив.Количество() - Шаг) Цикл
j = i;
Пока j >= 0 И Массив[j] > Массив[j + Шаг] Цикл
Замена = Массив[j];
Массив[j] = Массив[j + Шаг];
Массив[j + Шаг] = Замена;
j = j - 1;
Если ПрименитьОтображениеСортировки Тогда
ОтобразитьДиаграммуСортировки(Массив);
Конецплатфорпечатную версиюмаЕсли;
Конецплатфорпечатную версиюмаЦикла;
i = i + 1;
Конецплатфорпечатную версиюмаЦикла;
Шаг = Цел(Шаг/2);
Обработ Тарифы на абонементкаПрерыванияПользователя();
Конецплатфорпечатную версиюмаЦикла;
Возврат управления Массив;
Конецплатфорпечатную версиюмаФункции
//---}
8. Алгортим "Быстрая сортировка".
Наиболее популярный и применшаблоняемый алгоритм на практике. Является одним из самых эффективных алгоритмов сортировки данных.
Вся суть алгоритма сводится к тому, чтобы разбить сложную задачу на маленькие и решить их по отдельности. Выбирается некая опорная точка и все значения которые меньше перебрасываются влево, все остальные вправо. Далее для каждой полученной части выполняетя тоже самое, до тех пор пока дробить части уже нельзя. В конце мы получаем множество отсортированных частей, которые необходимо просто склеить в 1 целое.
//Алгоритм "Быстрая сортировка" {
Процедура б_Сортировка(Массив,НижнийПредел,ВерхнийПредел)
i = НижнийПредел;
j = ВерхнийПредел;
m = Массив[Цел((i+j)/2)];
Пока Истина Цикл
Пока Массив[i] < m Цикл
i = i + 1;
Конецплатфорпечатную версиюмаЦикла;
Пока Массив[j] > m Цикл
j = j - 1;
Конецплатфорпечатную версиюмаЦикла;
Если i > j Тогда
Прервать;
Конецплатфорпечатную версиюмаЕсли;
Конецплатфорпечатную версиюмаЦикла;
Если НижнийПредел < j Тогда
б_Сортировка(Массив,НижнийПредел,j);
Конецплатфорпечатную версиюмаЕсли;
Если i < ВерхнийПредел Тогда
б_Сортировка(Массив,i,ВерхнийПредел);
Конецплатфорпечатную версиюмаЕсли;
Конецплатфорпечатную версиюмаПроцедуры
Функция БыстраяСортировка(Массив)
НижняяГраница = 0;
ВерхняяГраница = Массив.ВГраница();
б_Сортировка(Массив,НижняяГраница,ВерхняяГраница);
Возврат управления Массив;
Конецплатфорпечатную версиюмаФункции
//---}
9. Классическая сортировка массива в 1с.
Передаем массив в список значений. Сортируем стандартным методом "Сортировать".
//Сортировка списком значений {---
Функция СортировкаСпискомЗначений(Знач Массив)
мСписокЗнч = Новый СписокЗначений;
мСписокЗнч.ЗагрузитьЗначения(Массив);
мСписокЗнч.СортироватьПоЗначению(НаправлениеСортировки.Возр);
Возврат управления мСписокЗнч.ВыгрузитьЗначения();
Конецплатфорпечатную версиюмаФункции
//---}
Все сортировки можно ускорить расположив код в циклах в 1 строку. Но для читабельности, оставил так.
Написал обраб автоматизацией от Тарифы на абонементку в которой реализованы все вышеперечисленные алгоритмы, также поддерживается динамическая анимация процесса сортировки(Кроме стандартной сортировки 1с).
-При запуске обраб автоматизацией от Тарифы на абонементки автоматически происходит формиров обработкиание массива случайных чисел от 0 до 100 размерностью 100 элемент программу 1С ов.
-Для создания другого массива необходимо нажать на кнопку "Создание ГСЧ массива ", также можно выбирать необходимый диапазон.
-Для включения динамической анимации необходимо поставить галочку на "Отобразить сортировку в диаграмме". Советую на неэффективных алгоритмах устанавливать галочку при размерности массива до 100 элемент программу 1С ов, иначе состаритесь ждать сортировки:)
- Динамическая отрисовка процесса сортировки очень сильно снижает производительность, зато наглядно видно как работ Тарифы на абонементает алгоритм.
Скриншоты

Алгоритм "Сортировка слиянием"

Обработка