Имя: Пароль:
1C
 
Сортировка слиянием
0 vi0
 
10.07.18
16:50
Предлагаю вспомнить вузовскую программу - сортировка слиянием через рекурсию. У кого какая есть критика, мысли - прошу высказываться

Функция mergeSort(A)
    
    n = A.Количество();
    
    if n = 1 Тогда
        return A
    КонецЕсли;
    
    middle = Цел(n/2);
    
    leftHalf = ЧастьМассива(A, 0, middle-1);
    rightHalf = ЧастьМассива(A, middle, n-1);
    
    L = mergeSort(leftHalf);  // разбиваем еще раз
    R = mergeSort(rightHalf); //
    
    
    return merge(L, R); // сортировка слиянием
    
КонецФункции

function merge(A, B)
    
    // дошли нижнего уровня рекурсии
    if not ЗначениеЗаполнено(A) then
        return B;
    endif;
    
    if not ЗначениеЗаполнено(B) then
        return A;
    endif;
    
    
    An = A.Количество()-1;
    Bn = B.Количество()-1;
    
    if A[0] < B[0] then
        m = merge(ЧастьМассива(A,1,An), B);
        return concat(A[0], m);
    else
        m = merge(A, ЧастьМассива(B,1,Bn));
        return concat(B[0], m);
    endif
    
КонецФункции

Функция concat(Значение, Массив)
    
    Результат = Массив;
    Результат.Вставить(0, Значение);
    
    возврат Результат;
    
КонецФункции

Функция ЧастьМассива(Массив, ИндексПервого, ИндексПоследнего)
    
    результат = Новый Массив;
    
    Для сч=ИндексПервого по ИндексПоследнего Цикл
        результат.Добавить(Массив[сч]);
    КонецЦикла;
    
    
    Возврат результат;
    
КонецФункции

Процедура Пример()
    
    A = new Array;
    A.Добавить(6);
    A.Добавить(5);
    A.Добавить(3);
    A.Добавить(1);
    A.Добавить(8);
    A.Добавить(7);
    A.Добавить(2);
    A.Добавить(4);
    
    
    A_сорт = mergeSort(A);
    Для каждого элемент Из A_сорт Цикл
        Сообщить(элемент);
    КонецЦикла;
    
КонецПроцедуры
1 vi0
 
10.07.18
16:54
2 МихаилМ
 
10.07.18
17:23
цель какая ?
3 vi0
 
11.07.18
03:58
Погружаюсь в алгоритмику
интересна обратная связь от сообщества
4 МихаилМ
 
11.07.18
04:09
для 1с алгоритм медленный, тк требует создания копий данных
5 vi0
 
11.07.18
04:13
(4) это сам алгоритм такой, что требует копий данных и требовательный к памяти
6 vi0
 
11.07.18
04:14
1с использую здесь просто как платформу для обучения
понимаю, что встроенные в платформу сортировки могут быть быстрее
7 VladZ
 
11.07.18
05:55
(0) Критикую:

Пиши на одном языке. Выбрал русский - пиши по-русски. Хочешь на буржуйском - пиши на буржуйском. Но не стоит прыгать туда-сюда. Привыкай делать сразу правильно. Разработчики, которые будут сопровождать твой код, проклянут тебя и предадут анафеме.
8 VladZ
 
11.07.18
06:14
+7 По поводу самой сортировки: программисту 1с это не нужно. Предлагаю не забивать голову ненужным хламом.

Шерлок Холмс: ...Ватсон, поймите: человеческий мозг — это пустой чердак, куда можно набить всё, что угодно. Дурак так и делает: тащит туда нужное и ненужное. И наконец наступает момент, когда самую необходимую вещь туда уже не запихнёшь. Или она запрятана так далеко, что ее не достанешь. Я же делаю всё по-другому. В моём чердаке только необходимые мне инструменты. Их много, но они в идеальном порядке и всегда под рукой. А лишнего хлама мне не нужно.
9 Emery
 
11.07.18
06:22
(0) > сортировка слиянием через рекурсию. У кого какая есть критика, мысли - прошу высказываться

На эту тему есть статья: «Рабочий алгоритм на С++ внешней сортировки «естественным слиянием» (Natural Merge Sort) с неубывающими и убывающими упорядоченными подпоследовательностями», в которой описан алгоритм имени моего имени :) http://emery-emerald.narod.ru/Cpp/2E1562.html .
10 vi0
 
11.07.18
06:50
(9) посмотрю
11 vi0
 
11.07.18
06:50
(7) критика больше интересна по сути
12 vi0
 
11.07.18
06:53
(8) ты считаешь что алгоритмическое мышление одинеснику не нужно?
13 Cyberhawk
 
11.07.18
07:29
Латиница в коде 1С - УГ
14 VladZ
 
11.07.18
07:34
(12) Любой программист должен "думать алгоритмами".  Я говорил про то, что 1с-нику не нужны сортировки.
15 WhiteDragon93
 
11.07.18
09:02
(0) чисто из интереса: что происходит в голове при написании такого кода?

if n = 1 Тогда
  return A
КонецЕсли;


Говнокод или обфускация?
16 Мимохожий Однако
 
11.07.18
09:07
(15) Может быть,  в пятницу открыть голосовалку? ))
17 vi0
 
11.07.18
09:19
Ребят, вяло
Активнее и больше по теме
18 ERWINS
 
11.07.18
09:26
Зачем?
19 Митяйский
 
11.07.18
09:50
(0) Мердж в рекурсии, написанный на 1с - гвно гвняное, просто кошмар. Я сам это обнаружил где-то с полгода назад, когда так же, как ты заморочился с вузовской теорией.

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

И сравни их время работы по отладчику. Можешь еще прикрутить счетчики количества сравнений и перезаписей, если очень уж хочется.
20 vi0
 
11.07.18
10:03
(19) > Мердж в рекурсии, написанный на 1с - гвно гвняное, просто кошмар
Соглашусь. Сам это понял, когда писал
21 vi0
 
11.07.18
10:05
(14) этой темы коснулся только в контексте сложности алгоритма  n*log(n)
https://habr.com/post/196226/
22 vi0
 
11.07.18
15:24
(15) взял код из статьи и дописал русскими конструкциями
23 МихаилМ
 
11.07.18
21:42
(22)  "взял код из статьи" - подход школьника.
я так делал в 7-8 классе.  на 1  курсе работал программистом-стажером в 92 году. сразу сказали -бред:

берешь библиотеки и из них используешь.

на лекции и семинары про сортировки я не ходил. все это было описано до х86.
24 NSSerg
 
11.07.18
22:07
(23) Если в рабочем проекте - то да. А если хочешь поднять свой скилл в алгоритмике - то без попыток реализовать в том числе и простейшие методы - уровень не поднимешь.
В 89-ом году, на сборах на союз (10-11 класс, победители финала чемпионата Ленинграда)  в том числе писали и сортировку фон-Нейманом, и другие тривиальные методы в качестве подготовки.
Если писал фон-Неймана в 80-ые годы в 7-8 классе - то по тем временам это просто зашеаливающий уровень.
25 NSSerg
 
11.07.18
22:10
(23) виноват, не так проситал.
26 NSSerg
 
11.07.18
22:11
(25) *прочитал :)
27 МихаилМ
 
11.07.18
22:21
(24)тут важен подход. как исследовательский так и практический. просто к какому-то моменту у прога должна появляться  библиотека наработок. которая пополняется из библиотеки экспериментов и чужих наработок .

соответственно процесс постоянный. конечно "открытия" возможны на всех уровнях и даже школьном.
28 NSSerg
 
11.07.18
22:30
(27) Смысл изучения алгоритмов ведь не в том чтоб знать их, всё есть в библиотеках, а в том чтоб научиться  придумывать  эффективные алгоритмы в нестандартных ситуациях, и чтоб знать что у задачи есть такие решения. Иначе увидев задачу можно и не понять, что для неё есть готовые алгоритмы. Можно привести пример задачи о рюкзаке. На форуме ветки по ней возникают с завидной периодичностью, и если бы вопрошающие знали хотя бы название задачи, то смогли бы нагуглить всяких алгоритмов. А когда ты знаешь условие, но не знаешь названия - нагуглить что-либо очень проблематично, и начинается изобретение велосипеда.
29 МихаилМ
 
11.07.18
22:33
библиотек алгоритмов с исходниками на других языках на порядки больше тк у студентов лабы не на 1с.

и прочие алгоритмы тоже появляются не на 1с.

и адаптация к 1с - спец тема ввиду заточенности 1с для других задач.
30 едолюб
 
11.07.18
22:35
(28) >На форуме ветки по ней возникают с завидной периодичностью

пруф?
31 NSSerg
 
11.07.18
22:36
(30) набери в поиске гугли
задача о рюкзаке site:forum.mista.ru
32 NSSerg
 
11.07.18
22:36
33 МихаилМ
 
11.07.18
22:39
(28) на  этом форуме про рюкзак кроме Вас и козлова.

никто не отвечает.

те можно плавно перейти к теме программист 1с - не программист.

я хочу сделать акцент на выборе инструмента для прокачки темы алгоритмики в программировании. и бесмысленности  портирования в 1с.
34 NSSerg
 
11.07.18
22:50
(33)  Учитывая что большая часть веток на мисте - это вопросы по решению простых алгоритмических задач, а учитывая что эти ветки иногда висят без решения непозволительно долго, ИМХО для многих 1Сников было бы не лишним поизучать алгоритму.
Если твой основной инструмент 1С - то почему бы не писать решения простых алгоритмических задач в качестве тренировки на 1С? Хотя, опять-таки ИМХО, лучше выучить еще какой язык, чтоб решать эти задачи на сайтах с автоматической проверкой решения.
35 vi0
 
12.07.18
05:05
(34) все верно
Сейчас один из вопросов у меня - найти хороший сборник задач по алгоритмам
36 vi0
 
12.07.18
05:13
(34) > чтоб решать эти задачи на сайтах с автоматической проверкой решения.
Какие хорошие сайты есть?
37 vi0
 
12.07.18
09:54
(33) > и бесмысленности  портирования в 1с
да хоть на псевдокоде
38 Timon1405
 
12.07.18
10:00
39 NSSerg
 
12.07.18
11:25
(35) codeforces.ru
На нем все, начиная с начинающих до профи.
Регистрируешься, заходишь в Архив, сортируешь задачи по количеству решивших, и начинаешь решать начиная с самых простых. То есть с тех которые решили больше народу.
http://codeforces.com/problemset?order=BY_SOLVED_DESC
40 NSSerg
 
12.07.18
11:27
https://informatics.msk.ru/moodle/
Вот тут попроще.
41 vi0
 
13.07.18
03:59
Спасибо всем за рекомендации
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс