1. 1C / Говнокод #10297

    −102

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    Процедура СортировкаСписка(Список) 
    	
    	Перем лСредний;  
    	
    	лЛевый= СоздатьОбъект("СписокЗначений");
    	лПравый = СоздатьОбъект("СписокЗначений");
    	
    	Если Список.РазмерСписка()>1 Тогда  
    		
    		лРазмерСписка = Список.РазмерСписка();
    		лПозицияСреднего = Цел(лРазмерСписка/2);
    		лСреднее = Список.ПолучитьЗначение(лПозицияСреднего);
    		
    		Для й = 1 По лРазмерСписка Цикл
    			
    			Если й<>лПозицияСреднего Тогда
    				
    				лПроверяемоеЗначение =  Список.ПолучитьЗначение(й);
    				
    				Если лПроверяемоеЗначение<лСреднее Тогда
    					
    					лЛевый.ДобавитьЗначение(лПроверяемоеЗначение);
    					
    				ИначеЕсли лПроверяемоеЗначение>лСреднее Тогда
    					
    					лПравый.ДобавитьЗначение(лПроверяемоеЗначение);
    					
    				КонецЕсли;
    				
    			КонецЕсли;
    			
    		КонецЦикла;
    		
    		СортировкаСписка(лЛевый);
    		СортировкаСписка(лПравый);
    		
    		Список.УдалитьВсе();
    		
    		Для й = 1 По лЛевый.РазмерСписка() Цикл
    			Список.ДобавитьЗначение(лЛевый.ПолучитьЗначение(й));
    		КонецЦикла; 
    		
    		Список.ДобавитьЗначение(лСреднее); 
    		
    		Для й = 1 По лПравый.РазмерСписка() Цикл
    			Список.ДобавитьЗначение(лПравый.ПолучитьЗначение(й));
    		КонецЦикла;
    		
    	КонецЕсли;
    	
    	
    КонецПроцедуры
    
    Процедура Выполнить()
    	
    	ОтсортированныйСписок = СоздатьОбъект("СписокЗначений");
    	
    	СписокЗначений = СоздатьОбъект("СписокЗначений");   
    	
    	СписокЗначений.ДобавитьЗначение(2);
    	СписокЗначений.ДобавитьЗначение(7);
    	СписокЗначений.ДобавитьЗначение(15);
    	СписокЗначений.ДобавитьЗначение(16);
    	СписокЗначений.ДобавитьЗначение(20);
    	СписокЗначений.ДобавитьЗначение(21);
    	СписокЗначений.ДобавитьЗначение(3);
    	СписокЗначений.ДобавитьЗначение(5);
    	СписокЗначений.ДобавитьЗначение(4);
    	СписокЗначений.ДобавитьЗначение(14);
    	СписокЗначений.ДобавитьЗначение(12);
    	СписокЗначений.ДобавитьЗначение(13);
    	СписокЗначений.ДобавитьЗначение(11);
    	СписокЗначений.ДобавитьЗначение(19);
    	СписокЗначений.ДобавитьЗначение(1);
    	СписокЗначений.ДобавитьЗначение(8);
    	СписокЗначений.ДобавитьЗначение(6);
    	СписокЗначений.ДобавитьЗначение(17);
    	СписокЗначений.ДобавитьЗначение(9);
    	СписокЗначений.ДобавитьЗначение(10);
    	СписокЗначений.ДобавитьЗначение(18);
    	
    	СортировкаСписка(СписокЗначений);
    	
    	ВыбранноеЗначение = 0;
    	СписокЗначений.ВыбратьЗначение(ВыбранноеЗначение);
    	
    КонецПроцедуры

    Запостил: informatikmarazmatik, 16 Мая 2012

    Комментарии (5) RSS

    • ЖЖесть. :) Я не знаком, конечно, с 1с, но насколько я понял - оно даже если сортировать особо нечего (всё и так по порядку) - всё равно весь список перелопатит. :)
      Ответить
    • Не вникал в детали реализации, не искал ошибки.
      Но по виду это действительно qsort - самый теоретически быстрый алгоритм сортировки в среднем случае.
      В чем шутка юмора?
      Ответить
      • а прикол вот в чем:

        Синтаксис:

        Сортировать(<Направление>, <ДокументыПоДате>)

        Англоязычный синоним:

        Sort

        Параметры:

        <Направление>


        Необязательный параметр. Числовое выражение. Если — 0, то сортировка по возрастанию. Если не 0 то сортировка по убыванию. Значение по умолчанию — 0.

        <ДокументыПоДате>


        Необязательный параметр. Имеет смысл только в том случае, если значениями списка значений являются документы. В этом случае можно задавать сортировку документов по их хронологии. Число: 1 — сортировка по хронологии документов; 0 — нет. Значение по умолчанию — 0.

        Описание:

        Метод Сортировать выполняет сортировку списка по значениям. Если первый элемент списка (значение в первой позиции) имеет базовый тип данных (число, строка, дата), то сортировка проводится по значениям элементов, приведенных стандартными правилами к типу первого элемента. В противном случае, если первый элемент имеет агрегатный тип данных, сортировка проводится по значениям элементов, приведенных к строковому представлению типа данных.

        Пример:

        Спис.Сортировать();
        Ответить
        • Интересно было бы увидеть сравнение встроенных в платформу и рукописных алгоритмов сортировки.
          Для 7.7 (а если я не ошибаюсь, в топике именно она) это конечно не очень актуально, но для 8.2 или 8.3 глянул бы.
          Ответить

    Добавить комментарий