Как отсортировать массив 1с

Обновлено: 05.07.2024

О различных способах сортировки массивов в 1С наверняка написано уже немало статей. Я решил написать еще одну.

Итак, вот небольшая функция, которая создает массив заданного размера:

тГенератор = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата())); Для тСчет = 0 По фЧислоЭлементов-1 Цикл //фЧислоЭлементов - это поле на форме мВозврат.Добавить(тГенератор.СлучайноеЧисло(0, 10000000));

Отсортируем полученный массив пузырьковым алгоритмом:

тДатаНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); Для тИндекс2 = 0 По тМассив.Вграница() - тИндекс1 - 1 Цикл Если тМассив[тИндекс2] тМассив[тИндекс2+1] Тогда - сортировка по возрастанию тДатаОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах(); Сообщить("Время работы (пузырьком): "+(тДатаОкончания-тДатаНачала)+" мс.");

Теперь отсортируем быстрым алгоритмом:

тДатаНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); тДатаОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах(); Сообщить("Время работы (быстрая): "+(тДатаОкончания-тДатаНачала)+" мс."); Процедура БыстраяСортировкаРек(тМассив, тНачИндекс, тКонИндекс) //Пока тМассив[иНачИндекс] иИндекс Цикл - сортировка по возрастанию

Сортировка массивов в 1С (1000 элементов)

Если иНачИндекс Сортировка массивов в 1С (1000 элементов)

Сортировка массивов в 1С (10000 элементов)

Сортировка массивов в 1С (10000 элементов)

Результаты, я думаю, говорят сами за себя: при увеличении количества элементов массива в 10 раз, время сортировки быстрым алгоритмом также увеличилось приблизительно в 10 раз, в том время как время сортировки пузырьковым алгоритмом увеличилось приблизительно в 100 раз.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

(Пока оценок нет)

Отправка файла методом POST в объекте WinHttpRequest из 1C

Математические функции при помощи VBScript в 1С

Во встроенном языке 1С присутствуют некоторые математические функции, но все же иногда их недостаточно.

HTTP-сервис в 1С: создание, публикация и отладка

Табличные части в документах и справочниках часто бывают достаточно большими — сотни и тысячи строк.

Время работы (тз): 1 906 мс.
Время работы (быстрая): 42 734 мс.

1 000 000 (миллион) записей

СписокЗначений = Новый СписокЗначений;
СписокЗначений.ЗагрузитьЗначения(Массив);
СписокЗначений.СортироватьПоЗначению();

3,26 сек
Время работы (ТЗ):

53,27 сек
Время работы (быстрая): даже не замерял

Полезная публикация, спасибо!

СписокЗначений.СортироватьПоЗначению(); это оч тормозная хрень у меня пара тысяч
элементов сортирует 16 сек

Ростислав , вот именно! Но люди не ищут лёгких путей!

Самый оптимальны и быстрый способ сортировки, это выгрузить массив в "список значений" и отсортировать его методом этого объекта, в 99.9% случаев программисты используют именно этот метод. Ниже рассмотрены другие способы сортировки, которые могут быть применены в некоторых специфичных задачах, например, недавно у меня была необходимость отсортировать массив состоящий из строк таблицы значений (сортировать надо было по одному из полей таблицы значений), быстрая сортировка была успешно применена.

Классическая сортировка массива в 1с через список значений

Передаем массив в список значений. Сортируем стандартным методом "Сортировать".

Алгоритм "Быстрая сортировка"

Наиболее популярный и применяемый алгоритм на практике. Является одним из самых эффективных алгоритмов сортировки данных.
Вся суть алгоритма сводится к тому, чтобы разбить сложную задачу на маленькие и решить их по отдельности. Выбирается некая опорная точка и все значения которые меньше перебрасываются влево, все остальные вправо. Далее для каждой полученной части выполняетя тоже самое, до тех пор пока дробить части уже нельзя. В конце мы получаем множество отсортированных частей, которые необходимо просто склеить в 1 целое.


Алгоритм "Сортировка выбором"

Является одним из самых простых алгоритмов сортировки массива. Смысл в том, чтобы идти по массиву и каждый раз искать минимальный элемент массива, обменивая его с начальным элементом неотсортированной части массива. На небольших массивах может оказаться даже эффективнее, чем более сложные алгоритмы сортировки, но в любом случае проигрывает на больших массивах. Число обменов элементов по сравнению с "пузырьковым" алгоритмом N/2, где N - число элементов массива.

Алгоритм:
1. Находим минимальный элемент в массиве.
2. Меняем местами минимальный и первый элемент местами.
3. Опять ищем минимальный элемент в неотсортированной части массива
4. Меняем местами уже второй элемент массива и минимальный найденный, потому как первый элемент массива является отсортированной частью.
5. Ищем минимальные значения и меняем местами элементы,пока массив не будет отсортирован до конца.

Алгоритм "Сортировка пузырьком"

Пожалуй самый известный алгоритм, применяемый в учебных целях, для практического же применения является слишком медленным. Алгоритм лежит в основе более сложных алгоритмов: "Шейкерная сортировка", "Пирамидальная сортировка", "Быстрая сортировка". Примечательно то, что один из самых быстрых алгоритмов "Быстрый алгоритм" был разработан путем модернизации одного из самых худших алгоритмов "Сортировки пузырьком"."Быстрая" и "Шейкерная" сортировки будут рассмотрены далее. Смысл алгоритма заключается в том, что самые "легкие" элементы массива как бы "всплывают" , а самые "тяжелые" "тонут". Отсюда и название "Сортировка пузырьком"

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

(Сортировка перемешиванием, Двунаправленная пузырьковая сортировка)

Алгоритм представляет собой одну из версий предыдущей сортировки - "сортировки пузырьком". Главное отличие в том, что в классической сортировке пузырьком происходит однонаправленное движение элементов снизу - вверх, то в шейкерной сортировке сначало происходит движение снизу-вверху, а затем сверху-вниз.

Алгоритм такой же, что и у пузырьковой сортировки + добавляется цикл пробега сверху-вниз.

В приведенном ниже примере, есть усовершенствование в шейкерной сортировке. В отличие от классической, используется в 2 раза меньше итераций.

Алгоритм "Гномья сортировка"

Алгоритм так странно назван благодаря голландскому ученому Дику Груну.

Гномья сортировка основана на технике, используемой обычным голландским садовым гномом (нидерл. tuinkabouter). Это метод, которым садовый гном сортирует линию цветочных горшков. По существу он смотрит на следующий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперёд, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперёд; если нет следующего горшка, он закончил. Вот собственно и все описание алгоритма "Гномья сортировка". Что интересно, алгоритм не содержит вложенных циклов, а сортирует весь массив за один проход.

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

Представляет собой простой алгоритм сортировки. Смысл заключается в том, что на каждом шаге мы берем элемент, ищем для него позицию и вставляем в нужное место.
Элементарный пример: При игре в дурака, вы тянете из колоды карту и вставляете ее в соответствующее место по возрастанию в имеющихся у вас картах. Или
в магазине вам дали сдачу 550 рублей- одна купюра 500, другая 50. Заглядываете в кошелек, а там купюры достоинством 10,100,1000. Вы вставляете купюру
достоинсвом 50р. между купюрами достоинством 10р и 100р, а купюру в 500 рублей между купюрами 100р и 1000р. Получается 10,50,100,500,1000 - Вот вам
и алгоритм "Сортировка вставками".
Таким образом с каждым шагом алгоритма, вам необходимо отсортировать подмассив данных и вставить значение в нужное место.

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

Интересный в плане реализации и идеи алгоритм. Смысл его в том, чтобы разбивать массив на подмассивы, пока длина каждого подмассива не будет равна 1. Тогда мы утверждаем, что такой подмассив отсортирован. Затем сливаем получившиеся подмассивы воедино, одновременно сравнивая и сортируя поэлементно значения подмассивов.

Алгортим "Сортировка Шелла"

Алгоритм назван так в честь американского ученого Дональда Шелла. По своей сути этот алгоритм является усовершенствованным алгоритмом "Сортировка вставками". Смысл алгоритма заключается в том, чтобы сравнивать не только элементы, стоящие рядом друг с другом, но и на некотором удалении. Сначало выбирается Шаг - некий промежуток, через который будут сравниваться элементы массива на каждой итерации. Обычно его определяют так:
Для первой итерации Шаг = Цел(Массив.Количество()/2), для последующих Шаг = Цел(Шаг/2). Т.е. постепенно шаг сокращается и когда Шаг будет равен 1 произойдет последние сравнение и массив будет отсортирован.

Пример:
Дан массив (10,5,3,1,14,2,7,12).
1. Шаг = 4.
Сортируем простыми вставками каждые 4 группы по 2 элемента (10,14)(5,2)(3,7)(1,12)

2. Шаг = 2
Сортируем простыми вставками каждые 2 группы по 4 элемента (10,3,14,7)(2,1,5,12)

3. Шаг = 1
Сортируем простыми вставками каждую 1 группу по 8 элементов.


Как создать массив

Для создания массива в 1С используется ключевое слово Новый после которого указывается имя класса.

В переменной МассивЗначений будет находиться массив.

В конструкторе массива можно указать количество элементов:

МассивЗначений = Новый Массив ( 8 ) ; //в массиве 8 элементов

Сразу после создания все элементы массива будут равны Неопределено. При этом размер массива может быть изменен, при добавлении в него новых элементов.

Для добавления элементов используется метод Добавить:

Можно добавлять новые элементы в массив через метод Вставить, с указанием индекса, куда нужно вставить новый элемент. Если указать индекс больше чем количество элементов в массиве, то в массив будет добавлено нужное количество элементов со значением Неопределено:

//в массиве [Первый, Второй, Третий, Неопределено, Неопределено, Шестой]

Количество элементов в массиве

При добавлении каждого нового элемента в массив, количество элементов увеличивается на единицу. Получить общее количество элементов в массиве можно с помощью метода Количество:

Индекс массива

//будет ошибка Индекс находится за границами массива

Граница массива

Получить элемент массива

Получить элемент массива можно через квадратные скобки или методом Получить:

Перебор массива

С помощью цикла Для Каждого:

Через цикл Для Каждого нельзя изменить значения массива, меняться будет переменная ЭлементМассива.

Перебрать массив можно и через цикл Для. В этом случае через индекс можно изменять значения массива:

//метод ВГраница() возвращает максимальный индекс массива

Поиск в массиве

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

Объекты типа массив в 1С 8.3 представляют собой совокупность упорядоченных значений любого типа, в том числе и типа «массив», что в свою очередь позволяет организовывать многомерные массивы. Идентификация значений осуществляется по индексам, нумерация которых начинается с «0».

Создание массива

Синтаксис:

Примеры:

Добавление элементов в массив

Примеры:


Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>



Получение значения элемента по индексу

Поиск в массиве 1С

Присвоение значений элементам массива

Примеры:

Как узнать количество элементов массива (размер массива)

Перебор массива 1С

Примеры:

Перебор всех элементов двумерного массива

Примеры:

Удаление элементов из массива

Примеры:

Как разложить строку в массив


Пример преобразования массива в список значений


Пример преобразования массива в таблицу значений


Сортировка массива 1С разными способами

Примеры:

Как свернуть массив в 1С

Пример:


Поддержите нас, расскажите друзьям!

СПРОСИТЕ в комментариях!

Услуги 1С

Наш канал на Youtube


При использовании данного сайта, вы подтверждаете свое согласие на использование файлов cookie в соответствии с настоящим уведомлением в отношении данного типа файлов. Если вы не согласны с тем, чтобы мы использовали данный тип файлов, то вы должны соответствующим образом установить настройки вашего браузера или не использовать сайт.

Отправляя любую форму на сайте, вы соглашаетесь с политикой конфиденциальности данного сайта.

Читайте также: