1с сортировать как число
Разбор популярных алгоритмов сортировки массивов, реализованных на 1с. + обработка с наглядной реализацией алгоритмов.
В статье рассмотрены одни из самых популярных алгоритмов сортировки для массивов, применяемых как практически, так и в учебных целях. Сразу хочу оговориться, что все рассмотренные алгоритмы медленнее, чем метод классической сортировки массива через список значений, но тем не менее, заслуживают внимания. Текста получается много, поэтому по каждому алгоритму описываю самое основное.
1.Алгоритм "Сортировка выбором".
Является одним из самых простых алгоритмов сортировки массива. Смысл в том, чтобы идти по массиву и каждый раз искать минимальный элемент массива, обменивая его с начальным элементом неотсортированной части массива. На небольших массивах может оказаться даже эффективнее, чем более сложные алгоритмы сортировки, но в любом случае проигрывает на больших массивах. Число обменов элементов по сравнению с "пузырьковым" алгоритмом N/2, где N - число элементов массива.
Алгоритм:
1. Находим минимальный элемент в массиве.
2. Меняем местами минимальный и первый элемент местами.
3. Опять ищем минимальный элемент в неотсортированной части массива
4. Меняем местами уже второй элемент массива и минимальный найденный, потому как первый элемент массива является отсортированной частью.
5. Ищем минимальные значения и меняем местами элементы,пока массив не будет отсортирован до конца.
2.Алгоритм "Сортировка пузырьком".
Пожалуй самый известный алгоритм, применяемый в учебных целях, для практического же применения является слишком медленным. Алгоритм лежит в основе более сложных алгоритмов: "Шейкерная сортировка", "Пирамидальная сортировка", "Быстрая сортировка". Примечательно то, что один из самых быстрых алгоритмов "Быстрый алгоритм" был разработан путем модернизации одного из самых худших алгоритмов "Сортировки пузырьком"."Быстрая" и "Шейкерная" сортировки будут рассмотрены далее. Смысл алгоритма заключается в том, что самые "легкие" элементы массива как бы "всплывают" , а самые "тяжелые" "тонут". Отсюда и название "Сортировка пузырьком"
Алгоритм:
1. Каждый элемент массива сравнивается с последующим и если элемент[i] > элемент[i+1] происходит замена. Таким образом самые "легкие" элементы "всплывают" - перемещаются к началу списка,а самые тяжелые "тонут" - перемещаются к концу.
2. Повторяем Шаг 1 n-1 раз, где n - Массив.Количество ().
3.Алгоритм "Шейкерная сортировка"(Сортировка перемешиванием,Двунаправленная пузырьковая сортировка).
Алгоритм представляет собой одну из версий предыдущей сортировки - "сортировки пузырьком". Главное отличие в том, что в классической сортировке пузырьком происходит однонаправленное движение элементов снизу - вверх, то в шейкерной сортировке сначало происходит движение снизу-вверху, а затем сверху-вниз.
Алгоритм такой же, что и у пузырьковой сортировки + добавляется цикл пробега сверху-вниз.
В приведенном ниже примере, есть усовершенствование в шейкерной сортировке. В отличие от классической, используется в 2 раза меньше итераций.
4. Алгоритм "Гномья сортировка".
Алгоритм так странно назван благодаря голландскому ученому Дику Груну.
Гномья сортировка основана на технике, используемой обычным голландским садовым гномом (нидерл. tuinkabouter). Это метод, которым садовый гном сортирует линию цветочных горшков. По существу он смотрит на следующий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперёд, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперёд; если нет следующего горшка, он закончил.
Дик Грун
Вот собственно и все описание алгоритма "Гномья сортировка". Что интересно, алгоритм не содержит вложенных циклов, а сортирует весь массив за один проход.
5. Алгоритм "Сортировка вставками".
Представляет собой простой алгоритм сортировки. Смысл заключается в том, что на каждом шаге мы берем элемент, ищем для него позицию и вставляем в нужное место.
Элементарный пример: При игре в дурака, вы тянете из колоды карту и вставляете ее в соответствующее место по возрастанию в имеющихся у вас картах. Или
в магазине вам дали сдачу 550 рублей- одна купюра 500, другая 50. Заглядываете в кошелек, а там купюры достоинством 10,100,1000. Вы вставляете купюру
достоинсвом 50р. между купюрами достоинством 10р и 100р, а купюру в 500 рублей между купюрами 100р и 1000р. Получается 10,50,100,500,1000 - Вот вам
и алгоритм "Сортировка вставками".
Таким образом с каждым шагом алгоритма, вам необходимо отсортировать подмассив данных и вставить значение в нужное место.
6. Алгортим "Сортировка слиянием".
Интересный в плане реализации и идеи алгоритм. Смысл его в том, чтобы разбивать массив на подмассивы, пока длина каждого подмассива не будет равна 1. Тогда мы утверждаем, что такой подмассив отсортирован. Затем сливаем получившиеся подмассивы воедино, одновременно сравнивая и сортируя поэлементно значения подмассивов.
p/s не смог вставить сюда рисунок с более наглядной схемой, постоянно размазывается. Зато хорошо видна в блоке скриншотов внизу. Можно посмотреть как работает алгоритм.
7. Алгортим "Сортировка Шелла".
Алгоритм назван так в честь американского ученого Дональда Шелла. По своей сути этот алгоритм является усовершенствованным алгоритмом "Сортировка вставками". Смысл алгоритма заключается в том, чтобы сравнивать не только элементы, стоящие рядом друг с другом, но и на некотором удалении. Сначало выбирается Шаг - некий промежуток, через который будут сравниваться элементы массива на каждой итерации. Обычно его определяют так:
Для первой итерации Шаг = Цел(Массив.Количество()/2), для последующих Шаг = Цел(Шаг/2). Т.е. постепенно шаг сокращается и когда Шаг будет равен 1 произойдет последние сравнение и массив будет отсортирован.
Пример:
Дан массив (10,5,3,1,14,2,7,12).
1. Шаг = 4.
Сортируем простыми вставками каждые 4 группы по 2 элемента (10,14)(5,2)(3,7)(1,12)
10 , 2 , 3 ,1, 14 , 5 , 7 ,12
2. Шаг = 2
Сортируем простыми вставками каждые 2 группы по 4 элемента (10,3,14,7)(2,1,5,12)
3 , 1 , 7 , 2 , 10 , 5 , 14 , 12
3. Шаг = 1
Сортируем простыми вставками каждую 1 группу по 8 элементов.
8. Алгортим "Быстрая сортировка".
Наиболее популярный и применяемый алгоритм на практике. Является одним из самых эффективных алгоритмов сортировки данных.
Вся суть алгоритма сводится к тому, чтобы разбить сложную задачу на маленькие и решить их по отдельности. Выбирается некая опорная точка и все значения которые меньше перебрасываются влево, все остальные вправо. Далее для каждой полученной части выполняетя тоже самое, до тех пор пока дробить части уже нельзя. В конце мы получаем множество отсортированных частей, которые необходимо просто склеить в 1 целое.
9. Классическая сортировка массива в 1с.
Передаем массив в список значений. Сортируем стандартным методом "Сортировать".
Все сортировки можно ускорить расположив код в циклах в 1 строку. Но для читабельности, оставил так.
Написал обработку в которой реализованы все вышеперечисленные алгоритмы, также поддерживается динамическая анимация процесса сортировки (Кроме стандартной сортировки 1с).
-При запуске обработки автоматически происходит формирование массива случайных чисел от 0 до 100 размерностью 100 элементов.
-Для создания другого массива необходимо нажать на кнопку "Создание ГСЧ массива ", также можно выбирать необходимый диапазон.
-Для включения динамической анимации необходимо поставить галочку на "Отобразить сортировку в диаграмме". Советую на неэффективных алгоритмах устанавливать галочку при размерности массива до 100 элементов, иначе состаритесь ждать сортировки:)
- Динамическая отрисовка процесса сортировки очень сильно снижает производительность, зато наглядно видно как работает алгоритм.
всем привет
есть форма списка документов
у документов реквизит номер - строка какойтотам длины.
если тыкаешь "сортировать по этой колонке" - сортируется 1, 10, 100, 101.
понятное дело, что хотелось бы 1,2,3.
но есть вычурные номера - 123абЪ, 123абю/1
их тоже надо как-то впихнуть
и это щеё засунуть внутрь клика по сортировке
есть какие-то общеизвестные способы это сделать?
ну для начала хотя бы по 1,2,3 чтоб было ?
Заполнить массив как константу и сортировать по возрастанию строку с наименьшей суммой элементов
Задание: Заполнить массив как константу и сортировать по возрастанию строку с наименьшей суммой.
Сортировать строку
Нужно отсортировать едит1 по алфавиту и вывести в едит2 отсортированный вариант. Подскажите какими.
Ну так, чисто теоретически - в запросе добавить слева строку с кучей нулей и выбрать спрАва строку с длиной поля. Тогда строка '2' станет точно меньше строки '10': '00002' < '00010'. Вот с аналогом Прав в запросе проблема, нет, и наверно в обозримом будущем не будет. Разве что в документе или регистре сведений связанном с документом предусматривать поле с преобразованным таким образом номером и включать его в запрос управляемой формы списка
ну пожалуй да
придётся смириться с некоторым количеством документов с номерами 2 и 0000000002. их не очень много. какнить переименовать номер. например 2/а-1\Ъэюя и норм
спасибо
Сортировать строку по алфавиту
всем привет,Помогите, написал программу чтобы сортировать строку по алфавиту. Как можно переделать.
Cчитать строку из ListBox как целое число и как вещественное число
какие команды позволяют считать строку из ListBox как целое число и как вещественное число Ещё.
Сортировать строку по возрастанию кодов символов
Написать программу на языке Ассемблера, которая позволяет ввести с клавиатуры строку символов.
Сортировать по росту строку с минимальным элементом матрицы
Всем ку, помогите плиз сижу на экзамене нужна срочная помощь. Дана задача: Сортировать по росту.
Сортировать по возрастанию каждую строку массива в отдельности
Подскажите, пожалуйста, как сортировать, по возрастанию, каждую строку массива в отдельности? И.
Здравствуйте. Имеется запрос по котором строится отчет, в этом отчете есть поле "габариты изделия", в запросе это строковый тип, так как габариты могут содержать цифры, знаки, буквы. Делаю группировку и сортировку данных. Столкнулся с проблемой, что сортировка габаритов происходит только по первому символу, например:10,11,2,3. Как можно сделать так, чтобы в данный вариант сортировался так: 2,3,10,11.
V8. Упорядочивание по перечислению в запросе.
Столкнулась с проблемкой: в запросе делаю группировку (по итогам) по перечислению, затем внутри по.
1c77 двойное упорядочивание в запросе
Можно ли, если да, то какими средствами обеспечить в запросе упорядочивание (речь о справочнике.
Упорядочивание строк в документе
Процедура УпорядочитьСтроки() Если Вопрос("Упорядочить строки?","Да+Нет") = "Да" Тогда ТЗН =.
Упорядочивание в запросе 1с
Всем привет! Подскажите пожалуйста. В запросом получаю справочник номенклатуры и упорядочиваю "В.
Не по превому символу, а стандартная сортировка строк.
Можно преобразовать к числовому типу, если у вас все габариты начинаются с цифр, а буквы для сортировки вам не важны.
тогда никак, свою сортировку надо писать с учетом всех нюансов. Ведущие нули можно добавить попробовать ещё
Понятно, буду пробовать. Может подскажете тогда как грамотно в запросе выделить первый символ и узнать кол-во символов в строке.
Т.е. выясняем сколько цифр до первой буквы и дополняем нужное количество нулей. Всё это не в запросе конечно, а уже в обработке результата в Таблице значений.
Упорядочивание строк
"ввести 10 имен, вывести их на экран в алфавитном порядке." Меня интересует как это записать в.
Упорядочивание строк DataGridView
Здравствуйте, нужна помощь. Есть программа (см.вложении). Я заполняю DataGridView1 после запуска.
упорядочивание строк по возрастанию
Дана строка, состоящая из слов. Преобразовать строку таким образом, чтобы слова были упорядочены по.
Упорядочивание строк в матрице
Помогите пожалуйста с этим заданием. Уже неделю пытаюсь написать, вообще не получается. Дана.
Упорядочивание строк по возрастанию в матрице
Доброго времени суток. Срочно нужна консольная программа. Задача состоит в следующем: Задано.
Упорядочивание строк текстового файла
Помогите пожалуйста это реализовать, буду очень благодарен. Под заголовком окна горизонтально.
Есть таблица с колонками "Улица", "Дом", "Квартира". Нужно все это дело отсортировать по возрастанию. Все колонки имеют тип Строка, поэтому перед сортировкой привожу поля "Дом" и "Квартира" к типу Число. Проблема в том, что колонки "Дом" и "Квартира" могут содержать значения типа "14а", т.е. в число не перевести. Вариант строковой сортировки (1, 14, 14а, 2, 25. ) совершенно не устраивает. Надо чтобы было (1, 2, 14, 14а, 25. ).
Задача:
Отсортировать текст из слов состоящих из цифр по чиловому типу (не по алфавиту).
Ответ (один из возможных):
1. по количеству букв-цифр в слове.
2. по коду CHR буквы-цифры.
3. по букве в слове.
Lomok, при преобразовании в числовой формат у меня вылетает ошибка на значениях типа "14а".
В принципе, проблему эту я обошла, разделением номера дома и квартиры на две колонки:
//Функция разбивает строку вида "ЧисловыеСимволыПрочиеСимоволы" на две части "ЧисловыеСимволы" и "ПрочиеСимволы"
Функция ОтделениеЧисловойЧастиОтПрочего(СтрокаПроверки)
Для а = 1 По СтрДлина(СтрокаПроверки) Цикл
КодСимвола = КодСимвола(Сред(СтрокаПроверки, а, 1));
Если НЕ(КодСимвола >= 48 И КодСимвола Прервать;
КонецЕсли;
КонецЦикла;
Возврат Новый Структура ("ЧисловаяЧ, ПрочаяЧ", Лев(СтрокаПроверки, а-1), Прав(СтрокаПроверки, СтрДлина(СтрокаПроверки)-(а-1)));
КонецФункции
Пока Выборка.Следующий() Цикл
Стр = ТабРезультатаЗапроса.Добавить();
НомерДома = ОтделениеЧисловойЧастиОтПрочего(СокрЛП(Выборка.Дом));
Стр.Дом = ?(НомерДома.ЧисловаяЧ="",0,Число(НомерДома.ЧисловаяЧ));
Стр.БуковкаДома = НомерДома.ПрочаяЧ;
НомерКвартиры = ОтделениеЧисловойЧастиОтПрочего(СокрЛП(Выборка.Квартира));
Стр.Квартира = ?(НомерКвартиры.ЧисловаяЧ="",0,Число(НомерКвартиры.ЧисловаяЧ));
Стр.БуковкаКвартиры = НомерКвартиры.ПрочаяЧ;
КонецЦикла;
ТабРезультатаЗапроса.Сортировать("Дом, БуковкаДома, Квартира, БуковкаКвартиры");
Просто думала, что есть более простое решение. И более универсальное, т.к. вторая половина номера сортируется как строка, несмотря на возможное наличие чисел.
Шёпот теней, "по коду CHR буквы-цифры" - заинтересовал этот вариант, только не могу сообразить как его осуществить. Куда коды символов записывать и как их сортировать? В массив?
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: упорядочивание
Автор уроков и преподаватель школы: Владимир Милькин
Упорядочивание в запросах
Давайте напишем запрос, который получает из таблицы Справочник.Еда код и название еды:
Как всегда, выполните этот запрос у себя на компьютере.
С большой долей вероятности у вас получится следующий результат:
Возможно вы удивитесь, но при таком написании запроса никто не гарантирует нам именно такого порядка выдачи записей в таблице. В случае использования клиент-серверного режима работы на различных СУБД результат мог бы быть и такой:
И . ну в общем вы поняли, что если мы не указываем порядок сортировки (упорядочивания) результата запроса, то этот самый порядок может быть абсолютно любым.
Секция УПОРЯДОЧИТЬ ПО
Поля по которым требуется упорядочить запрос перечисляются в секции УПОРЯДОЧИТЬ ПО через запятую:
Следом за именем поля упорядочивания может идти одно из двух ключевых слов:
- ВОЗР- упорядочивание по возрастанию.
- УБЫВ - упорядочивание по убыванию.
Если не указывать ни одно из этих слов, считается, что сортировка идёт по возрастанию.
Вооружившись знаниями, давайте упорядочим результат нашего запроса по убыванию поля Код:
По возрастанию поля Наименование (алфавитный порядок):
А теперь упорядочим следующую таблицу
так, чтобы сначала шла сортировка по полю Вкус по возрастанию, а затем (среди строчек с одинаковым значением поля Вкус) шла сортировка по полю Цвет по убыванию:
Отдельно обращаю ваше внимание на то, что мы указали сортировку не по самим полям Вкус и Цвет, а по их строковому реквизиту Наименование. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Это связано с тем, что сортировка возможна лишь по полям имеющим один из типов: Строка, Число, Дата.
А поля Вкус и Цвет являются ссылками на элементы справочников Вкус и Цвет, сортировать по которым не имеет смысла (в этом случае сортировка будет вестись по внутреннему идентификатору ссылки). Зато можно сделать сортировку по одному из реквизитов этих элементов. Наиболее подходящим в нашем случае будет строковый реквизит Наименование.
Возможность автоупорядочивания
Ключевое слово АВТОУПОРЯДОЧИВАНИЕ позволяет включить режим автоматического формирования полей для упорядочивания результатов запроса.
Мы сейчас познакомимся с этой возможностью подробно, но сразу хочется оговориться, что фирма "1С" в своих методических рекомендациях не советует использовать её без необходимости (о причинах этого мы поговорим ниже).
Прежде всего, ключевое слово АВТОУПОРЯДОЧИВАНИЕ может быть расположено в запросе сразу за или вместо секции УПОРЯДОЧИТЬ ПО:
Автоупорядочивание работает по следующим принципам:
Тогда ссылка на каждую таблицу в этой секции будут заменена полями, по которым по умолчанию сортируется эта таблица.
Для таблиц справочников полями сортировки по умолчанию являются код и наименование, выбор из которых осуществляется в соответствии с настройками справочника в конфигураторе:
Для таблиц документов полем сортировки по умолчанию является дата документа.
Так как поле сортировки ЛюбимыйЦвет имеет тип Справочник.Цвета, в настройках которого основным представлением выбрано поле Наименование, то этот запрос эквивалентен:
- отсутствует секция УПОРЯДОЧИТЬ ПО
- но есть секция ИТОГИ ПО (её мы будем проходить позже)
В этом случае результат запроса будет упорядочен по полям итогов (в той же последовательности).
Если среди этих полей есть ссылки на таблицы, то они также будут заменены полями, по которым сортируются эти таблицы по умолчанию.
- отсутствует секция УПОРЯДОЧИТЬ ПО
- отсутствует секция ИТОГИ ПО
- но есть секция СГРУППИРОВАТЬ ПО (группировку мы проходили здесь)
В этом случае результат запроса будет упорядочен по полям группировки (в той же последовательности).
Если среди этих полей есть ссылки на таблицы, то они также будут заменены полями, по которым сортируются эти таблицы по умолчанию.
Так как поле группировки Город имеет тип Справочник.Города, в настройках которого основным представлением выбрано поле Наименование, то этот запрос эквивалентен:
Наконец, если в запросе:
- отсутствует секция УПОРЯДОЧИТЬ ПО
- отсутствует секция ИТОГИ ПО
- отсутствует секция СГРУППИРОВАТЬ ПО
В этом случае результат запроса будет упорядочен по полям сортировки по умолчанию для таблиц, из которых выбираются данные, в порядке их появления в запросе.
Так как данные выбираются из справочника Еда, в настройках которого основным представлением выбрано поле Наименование, то этот запрос будет эквивалентен:
Почему использование автоупорядочивания нежелательно
- для универсальных запросов, когда разработчик не может предвидеть из каких таблиц будут запрашиваться данные
- для случаев, когда получаемый порядок записей не важен, но при этом он должен быть одинаковым в независимости от применяемой СУБД
Во всех остальных случаях использовать возможность автоупорядочивания нежелательно, так как поля, которые являются полями сортировки сегодня, могут перестать быть такими завтра.
Например, сегодня мы можем написать код, чувствительный к тому, чтобы результаты запроса из справочника Еда были отсортированы по полю Наименование.
А завтра фирма "1С" (или другой разработчик) изменят настройки базы в конфигураторе так, что полем сортировки по умолчанию для справочника Еда станет, к примеру, поле Код. И, если мы использовали автоупорядочивание в запросе, то наш отчет сломается, ведь порядок сортировки уже будет другим. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Поэтому всегда старайтесь указывать конкретные поля и конкретный порядок сортировки по ним в секции УПОРЯДОЧИТЬ ПО, такой запрос уже не сломать просто так:
Читайте также: