Имя: Пароль:
1C
1С v8
Быстрая сортировка
0 UserNotFound
 
09.08.12
13:47
Поделитесь, пожалуйста, кодом быстрой сортировки на 1С или ссылкой на открытый источник с ним. А то что-то найденные примеры не правильно работают.
1 aleks-id
 
09.08.12
13:47
код сортировки чего?
2 Maxus43
 
09.08.12
13:48
что сортировать? сферический коней в вакууме?
3 aleks-id
 
09.08.12
13:48
практически у всех объектов есть или Сортировать или Упорядочить
4 UserNotFound
 
09.08.12
13:48
(1) Можно просто чисел.
5 aleks-id
 
09.08.12
13:48
(4) а числа эти где?
6 anddro
 
09.08.12
13:49
(5) сферические числа в вакууме
7 UserNotFound
 
09.08.12
13:50
(3) Хочется разобраться.
8 ptiz
 
09.08.12
13:50
Числа.СортироватьБыстро();
9 UserNotFound
 
09.08.12
13:51
(5) В общем без разницы.
10 MAnt
 
09.08.12
13:51
(7) wiki:Быстрая_сортировка
На 1С примерно также.
11 aleks-id
 
09.08.12
13:53
тз=новый таблицазначений;
тз.добавитьколонку("число");
новстр=тз.добавить();
новстр.число=5;

новстр=тз.добавить();
новстр.число=2;

новстр=тз.добавить();
новстр.число=7;
тз.сортировать("число Возр");
12 anddro
 
09.08.12
13:54
(7) с чем разобраться?
в запросе ORDER BY / УПОРЯДОЧИТЬ ПО
у таблицы значений / дерева значений - Сортировать()
у списка значений СортироватьПоЗначению() и СортироватьПоПредставлению()
Этого мало? Или нужен закат солнца вручную с созданием двоичного дерева и балансировкой?
13 ssh2006
 
09.08.12
13:55
(12) сказано же - "не правильно работают."
14 UserNotFound
 
09.08.12
13:56
(10) Чего-то не получается на 1С сделать. На Дельфи без проблем.
(11) (12) Надо написать именно программный код, а не использовать возможности платформы.
15 Maxus43
 
09.08.12
13:57
>>Чего-то не получается на 1С сделать
что не получается? там всё 1 в 1 практически, можеш даже по англицки писать
16 MAnt
 
09.08.12
13:58
(14) На 1С в каком объекте данные хранишь?
17 UserNotFound
 
09.08.12
13:58
(12) Не правильно работают те, что написаны на 1С.
18 jk3
 
09.08.12
13:58
(14) Лаба?
19 UserNotFound
 
09.08.12
13:59
(18) Нет, чтобы просто разобраться.
20 Бледно Золотистый
 
09.08.12
13:59
(17)Значит криво написаны, 1с тут причем?
21 Molinor
 
09.08.12
14:00
Покажи код.
22 jk3
 
09.08.12
14:01
(19) Тогда в чём проблема?
Рекурсия в 1с точно так же работает.

Пиши с нуля, будет проще, чем ковырять чужой копрокод.
23 hhhh
 
09.08.12
14:01
похоже опять на тему: почему "9" больше чем "10"?
24 anddro
 
09.08.12
14:01
(17) какой критерий "правильности"? Может ты просто сортируешь значения ссылок, а хочешь увидеть сортировку по наименованию?
25 FIXXXL
 
09.08.12
14:04
(0) ищи по слову ИНДЕКС
быстро и всерьез
26 UserNotFound
 
09.08.12
14:05
(20) 1С тут не при чем. Только одни кривые примеры мне попадались.
27 UserNotFound
 
09.08.12
14:06
(24) Я сортирую просто числа.
28 Molinor
 
09.08.12
14:07
(27) Показывай код уже.
29 jk3
 
09.08.12
14:07
(26) Не удивлён насчёт кривых примеров, т.к. смысла нет писать красиво ради сферических коней :)
30 UserNotFound
 
09.08.12
14:07
(21) Функция СравнитьЗначения(Знач1, Знач2)
   Если Знач1>Знач2 Тогда
       Возврат 1;
   КонецЕсли;
   Если Знач1<Знач2 Тогда
       Возврат -1;
   КонецЕсли;
   Возврат 0;
КонецФункции

Функция ПолучитьЗначение(Список, Номер)
   стр="";
   Возврат Список.ПолучитьЗначение(Номер, стр);
КонецФункции

Процедура УстановитьЗначение(Список, Номер, Значение)
   Список.УстановитьЗначение(Номер, Значение);
КонецПроцедуры

Процедура qs_0(s_arr, first, last)

   i = first;
   j = last;
   x = ПолучитьЗначение(s_arr, (first + last) / 2);

   Пока СравнитьЗначения(ПолучитьЗначение(s_arr, i), x)=-1 Цикл
       i=i+1;
   КонецЦикла;
   Пока СравнитьЗначения(ПолучитьЗначение(s_arr, j), x)=1 Цикл
       j=j-1;
   КонецЦикла;
   Если i <= j Тогда
       Если i < j Тогда
           к=ПолучитьЗначение(s_arr, i);
           УстановитьЗначение(s_arr, i, ПолучитьЗначение(s_arr, j));
           УстановитьЗначение(s_arr, j, к);
       КонецЕсли;
       i=i+1;
       j=j-1;
   КонецЕсли;

   Пока i <= j Цикл
       Пока СравнитьЗначения(ПолучитьЗначение(s_arr, i), x)=-1 Цикл
           i=i+1;
       КонецЦикла;
       Пока СравнитьЗначения(ПолучитьЗначение(s_arr, j), x)=1 Цикл
           j=j-1;
       КонецЦикла;
       Если i <= j Тогда
           Если i < j Тогда
               к=ПолучитьЗначение(s_arr, i);
               УстановитьЗначение(s_arr, i, ПолучитьЗначение(s_arr, j));
               УстановитьЗначение(s_arr, j, к);
           КонецЕсли;
           i=i+1;
           j=j-1;
       КонецЕсли;
   КонецЦикла;

   Если i < last Тогда
       qs_0(s_arr, i, last);
   КонецЕсли;
   Если first < j Тогда
       qs_0(s_arr, first,j);
   КонецЕсли;
КонецПроцедуры

Процедура Сортировать(Список, Размер="", Первый="", Последний="")
   Если ПустоеЗначение(Первый)=1 Тогда
       Первый=1;
   КонецЕсли;
   Если ПустоеЗначение(Последний)=1 Тогда
       Последний=Размер;
   КонецЕсли;
   qs_0(Список, Первый, Последний);
КонецПроцедуры
31 anddro
 
09.08.12
14:10
(30) и если в этот алгоритм на вход подать список уже упорядоченных элементов ...
32 jk3
 
09.08.12
14:16
(30) В заголовке v8, код на v7
33 MAnt
 
09.08.12
14:18
На 1С это выглядит как-то так

Процедура БыстраяСортировка(мДанные,НижняяГраница,ВерняяГраница)
   
   i    = НижняяГраница;
   j    = ВерняяГраница;
   m    = мДанные[Цел((i+j)/2)];
   Пока Истина Цикл
       
       Пока мДанные[i] < m Цикл
           
           i    = i + 1;
           
       КонецЦикла;
       Пока мДанные[j] > m Цикл
           
           j    = j - 1;
           
       КонецЦикла;
       
       Если i<=j Тогда
           
           wsp            = мДанные[i];
           мДанные[i]    = мДанные[j];
           мДанные[j]    = wsp;
           i            = i + 1;
           j            = j - 1;
           
       КонецЕсли;
       
       Если i>j Тогда
           
           Прервать;
           
       КонецЕсли;
       
   КонецЦикла;
   Если НижняяГраница < j Тогда
       
       БыстраяСортировка(мДанные,НижняяГраница,j);
       
   КонецЕсли;
   Если i < ВерняяГраница Тогда
       
       БыстраяСортировка(мДанные,i,ВерняяГраница);
       
   КонецЕсли;
   
КонецПроцедуры

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   мДанные            = Новый Массив(10);
   ГенераторЧисел    = Новый ГенераторСлучайныхЧисел(0);
   сЧисла            = "";
   Для Счетчик = 0 По 9 Цикл
   
       мДанные[Счетчик]    = ГенераторЧисел.СлучайноеЧисло();
       сЧисла                = сЧисла + мДанные[Счетчик] + "; ";
   
   КонецЦикла;
   Сообщить(сЧисла);
   БыстраяСортировка(мДанные,0,9);
   сЧисла    = "";
   Для Счетчик = 0 По 9 Цикл
   
       сЧисла                = сЧисла + мДанные[Счетчик] + "; ";
   
   КонецЦикла;
   Сообщить(сЧисла);
   
КонецПроцедуры
34 UserNotFound
 
09.08.12
14:19
(32) Я его на v8 переделывал. Это пример того что нашел в Интернете. То что есть на v8 к показу пока не годится :)
35 UserNotFound
 
09.08.12
14:20
(33) Спасибо.
36 FIXXXL
 
09.08.12
14:22
запросом же быстрее
37 MAnt
 
09.08.12
14:26
(36) Быстрее чем что? Если данные брать из базы - быстрее, если из какого-нибудь файла подгружаются, то не факт.
38 UserNotFound
 
09.08.12
14:26
(36) Чтобы знать. Зачем учить пузырьковую сортировку, если она не эффективная?
39 anddro
 
09.08.12
14:28
(38) тогда учи их все  wiki:Алгоритм_сортировки
40 UserNotFound
 
09.08.12
14:30
(39) Спасибо, я в курсе.
41 FIXXXL
 
09.08.12
14:32
(37) быстрее и читабельнее вышеприведенных портянок
42 UserNotFound
 
09.08.12
14:35
(41) Вопрос состоит в том, чтобы знать больше, чем 1С.
43 FIXXXL
 
09.08.12
19:26
(42) иди за индексы читай, Коперник :)
2 + 2 = 3.9999999999999999999999999999999...