├── README.md
├── SortingAlgorithms.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ ├── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
│ └── xcuserdata
│ │ └── MacBookAir.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
└── xcuserdata
│ └── MacBookAir.xcuserdatad
│ ├── xcdebugger
│ └── Breakpoints_v2.xcbkptlist
│ └── xcschemes
│ └── xcschememanagement.plist
└── SortingAlgorithms
├── BubleSort.swift
├── CountingSort.swift
├── HeapSort.swift
├── MergeSort.swift
├── QuickSort.swift
├── SelectionSort.swift
├── ShakerSort.swift
├── ShellSort.swift
└── main.swift
/README.md:
--------------------------------------------------------------------------------
1 | ## Алгоритмы Сортировки
2 | традиционные алгоритмы сортировки массивов написанные на Swift 4
3 |
4 | ## Quick Sort (быстрая сортировка)
5 | Выбираем некоторый опорный элемент (например, средний). После этого разбиваем исходный массив на три части: элементы эквивалентные опорному, меньше, больше опорного.
6 | Рекурсивно вызовемся от большей и меньшей частей. В итоге получим отсортированный массив, так как каждый элемент меньше опорного стоял раньше каждого большего опорного.
7 |
8 | 
9 |
10 | **Асимптотика:**
11 |
12 | сложность в худшем | сложность в среднем | сложность в лучшем |
13 | --------------------|---------------------|--------------------|
14 | O(n2) | O(n log n) | O(n) |
15 | **худший случай**: если опорный элемент наименьший или наибольший из всех, то каждый раз массив разбивается на подмассивы размерами 1 и n-1 | - |**лучший случай**: массив постоянно разбивается опорным элементом на две раные части |
16 |
17 | **Расход памяти:** В общем случае O(log n). При неудачных подборках опорного элемнта O(n) - здесь память будет расходоваться не на создание новых вспомогательных массивов,
18 | а на рекурсию, хранение адресов возврата и локальных переменных.
19 |
20 | Алгоритм неустойчив (неудачные входные данные могут привести к значительному увеличению времени работы и расхода памяти).
21 | Является одним из самых быстродействующих алгоритмов, однако для массивов с небольшим количеством элементом может оказаться малоэффективным.
22 |
23 | ## Selection Sort (сортировка выбором)
24 | Алгоритм пробегает по всем ещё не упорядоченным элементам, ищет среди них минимальный (сохраняя его значение и индекс) и переставляет в конец выстриваемого списка.
25 |
26 | 
27 |
28 | **Асимптотика:**
29 |
30 | сложность в худшем | сложность в среднем | сложность в лучшем |
31 | --------------------|---------------------|--------------------|
32 | O(n2) | O(n2) | O(n2) |
33 |
34 | **Расход памяти:** O(1). Дополнительной памяти не требуется.
35 |
36 | Алгоритм неустойчив.
37 |
38 | ## Bubble Sort (пузырьковая сортировка)
39 | Соседние элементы сравниваются и при необходимости меняются местами, в результате "лёгкие" элементы перемещаются к началу списка, а "тяжёлые" - к концу. Операция циклически выполняется для оставшихся элементов.
40 |
41 | 
42 |
43 | **Асимптотика:**
44 |
45 | сложность в худшем | сложность в среднем | сложность в лучшем |
46 | --------------------|---------------------|--------------------|
47 | O(n2) | O(n2) | O(n) |
48 |
49 | **Расход памяти:** O(1). Дополнительной памяти не требуется.
50 |
51 | Алгоритм устойчив. На практике может использоваться лишь для сортировки маленьких массивов. И в этом случае лучше взять классическую сортировку, а не её модификацию.
52 |
53 | ## Shaker Sort (сортировка перемешиванием)
54 | Устанавливаем левую и правую границы сортируемой области массива. Поочерёдно просматриваем массив справа налево и слева направо. На очередной итерации при достижении правой границы
55 | сдвигаем её на предыдущий элемент (-1) и движемся справа налево, при достижении левой границы сдвигаем её на следующий элемент (+1) и двигаемся слева направо.
56 |
57 | 
58 |
59 | **Асимптотика:**
60 |
61 | сложность в худшем | сложность в среднем | сложность в лучшем |
62 | --------------------|--------------------------|-----------------------|
63 | O(n2) |зависит от выбранных шагов| O(n log2 n)|
64 | **худший случай**: отсортированный в обратном порядке массив| - |**лучший случай**: отсортированный массив|
65 |
66 | **Расход памяти:** O(1). Дополнительной памяти не требуется.
67 |
68 | Алгоритм устойчив.
69 |
70 | ## Shell Sort (сортировка Шелла)
71 | Сравниваем элементы находящиеся друг от друга на некотором расстоянии (шаге). В алгоритме два цикла. Внутренний переставляет элементы.
72 | Внешний служит для изменения шага, через который внутренний цикл элементы будет переставлять. Шаг постепенно сокращается до 1 (минимальное расстояние между двумя элементами) - и тогда алгоритм Шелла превращается в
73 | обычную сортировку вставками.
74 |
75 | 
76 |
77 | **Асимптотика:**
78 |
79 | сложность в худшем | сложность в среднем | сложность в лучшем |
80 | --------------------|---------------------|--------------------|
81 | O(n2) | O(n2) | O(n) |
82 | **худший случай**: неудачный выбор шага| - |**лучший случай**: массив уже отсортирован в правильном порядке|
83 |
84 | **Расход памяти:** O(1). Дополнительной памяти не требуется.
85 |
86 | Алгоритм неустойчив.
87 |
88 | ## Counting Sort (сортировка подсчётом)
89 | Проходимся по массиву и подсчитываем количество вхождений каждого элемента. После проходим по массиву значений и выводим каждое число столько раз, сколько нужно.
90 |
91 | 
92 |
93 | **Асимптотика:**
94 |
95 | сложность в худшем | сложность в среднем | сложность в лучшем |
96 | --------------------|---------------------|--------------------|
97 | O(n) | O(n) | O(n) |
98 |
99 | **Расход памяти:** O(1). Дополнительной памяти не требуется.
100 |
101 | Алгоритм устойчив. Применение сортировки подсчётом целесообразно лишь тогда, когда массив состоит из целочисленных, положительных чисел.
102 |
103 | ## Merge Sort (сортировка слиянием)
104 | Исходный массив делится надвое на всё меньшие подмассивы, пока количество элементов в очередных не станет равным 2 или 1.
105 | Если в подмассиве 2 элемента, то он упорядочивается банальным сравнением. А подмассив из одного элемента по своей сути является упорядоченным. Затем происходит обратный процесс - слияние подмассивов.
106 | Поскольку подмассивы к этому времени являются упорядоченными, то можем сравнивать лишь элементы, стоящие в их начале.
107 |
108 | 
109 |
110 | **Асимптотика:**
111 |
112 | сложность в худшем | сложность в среднем | сложность в лучшем |
113 | --------------------|---------------------|--------------------|
114 | O(n log n) | O(n log n) | O(n log n) |
115 |
116 | **Расход памяти:** O(n). Требует дополнительной памяти, примерно равной размеру исходного массива. Память расходуется на рекурсивный вызов и на постоянное создание вспомогательных подмассивов.
117 |
118 | Алгоритм устойчив. На «почти отсортированных» массивах работает столь же долго, как на хаотичных.
119 |
120 | ## Heap Sort (пирамидальная сортировка)
121 | Строим на основе неотсортированного массива так называемую двоичную кучу или пирамиду. В результате получается бинарное дерево каждый узел которого больше предыдущего, тем самым
122 | на вершине дерева оказывается элемент с максимальным значением. Затем вершина дерева переставляется в конец, откуда и будет выстраиваться отсортированный подмассив. А среди оставшихся элементов происходит ряд перестановок с целью восстановить дерево, чтобы в его вершине вновь оказался максимальный элемент из ещё не отсортированной части.
123 | Таким образом на первом месте постоянно оказывается один из самых "лёгких" элементов, который затем серией перестановок отправляется назад.
124 |
125 | 
126 |
127 | **Асимптотика:**
128 |
129 | сложность в худшем | сложность в среднем | сложность в лучшем |
130 | --------------------|---------------------|--------------------|
131 | O(n log n) | O(n log n) | O(n log n) |
132 |
133 | **Расход памяти:** O(1). Дополнительной памяти не требуется. Хотя в алгоритме присутствует рекурсивный вызов, но чтобы добраться до конца даже очень большого массива, рекурсий нужно мало, и они моментально закрываются.
134 |
135 | Алгоритм устойчив. На почти отсортированных массивах работает столь же долго, как и на хаотических данных. Не работает на связанных списках и других структурах памяти последовательного доступа.
136 | Из-за сложности реализации выигрыш получается только на больших размерах массива.
137 |
138 | ## TODO List
139 | * Сортировка расческой / Comb sort
140 | * Сортировка вставками / Insertion sort
141 | * Сортировка двоичным деревом / Tree sort
142 | * Гномья сортировка / Gnome sort
143 | * Блочная сортировка / Bucket sort
144 | * Поразрядная сортировка / Radix sort
145 | * Битонная сортировка / Bitonic sort
146 | * реализовать гибридную сортировку
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
--------------------------------------------------------------------------------
/SortingAlgorithms.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | D00325F620D4290900D84D0D /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00325F520D4290900D84D0D /* main.swift */; };
11 | D00325FD20D429A700D84D0D /* QuickSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00325FC20D429A700D84D0D /* QuickSort.swift */; };
12 | D00325FF20D42D2B00D84D0D /* SelectionSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00325FE20D42D2B00D84D0D /* SelectionSort.swift */; };
13 | D003D1B62101D3AA005EA7E6 /* ShellSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = D003D1B52101D3AA005EA7E6 /* ShellSort.swift */; };
14 | D0319FC220D5189100217AD1 /* BubleSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0319FC120D5189100217AD1 /* BubleSort.swift */; };
15 | D0319FC420D51E8200217AD1 /* ShakerSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0319FC320D51E8200217AD1 /* ShakerSort.swift */; };
16 | D09348F92115A9B3001859FD /* MergeSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09348F82115A9B3001859FD /* MergeSort.swift */; };
17 | D09348FB2115B62F001859FD /* HeapSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = D09348FA2115B62F001859FD /* HeapSort.swift */; };
18 | D096ACF42107D46E00D247C9 /* CountingSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = D096ACF32107D46E00D247C9 /* CountingSort.swift */; };
19 | /* End PBXBuildFile section */
20 |
21 | /* Begin PBXCopyFilesBuildPhase section */
22 | D00325F020D4290900D84D0D /* CopyFiles */ = {
23 | isa = PBXCopyFilesBuildPhase;
24 | buildActionMask = 2147483647;
25 | dstPath = /usr/share/man/man1/;
26 | dstSubfolderSpec = 0;
27 | files = (
28 | );
29 | runOnlyForDeploymentPostprocessing = 1;
30 | };
31 | /* End PBXCopyFilesBuildPhase section */
32 |
33 | /* Begin PBXFileReference section */
34 | D00325F220D4290900D84D0D /* SortingAlgorithms */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SortingAlgorithms; sourceTree = BUILT_PRODUCTS_DIR; };
35 | D00325F520D4290900D84D0D /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; };
36 | D00325FC20D429A700D84D0D /* QuickSort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSort.swift; sourceTree = ""; };
37 | D00325FE20D42D2B00D84D0D /* SelectionSort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectionSort.swift; sourceTree = ""; };
38 | D003D1B52101D3AA005EA7E6 /* ShellSort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShellSort.swift; sourceTree = ""; };
39 | D0319FC120D5189100217AD1 /* BubleSort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BubleSort.swift; sourceTree = ""; };
40 | D0319FC320D51E8200217AD1 /* ShakerSort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShakerSort.swift; sourceTree = ""; };
41 | D09348F82115A9B3001859FD /* MergeSort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MergeSort.swift; sourceTree = ""; };
42 | D09348FA2115B62F001859FD /* HeapSort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeapSort.swift; sourceTree = ""; };
43 | D096ACF32107D46E00D247C9 /* CountingSort.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountingSort.swift; sourceTree = ""; };
44 | /* End PBXFileReference section */
45 |
46 | /* Begin PBXFrameworksBuildPhase section */
47 | D00325EF20D4290900D84D0D /* Frameworks */ = {
48 | isa = PBXFrameworksBuildPhase;
49 | buildActionMask = 2147483647;
50 | files = (
51 | );
52 | runOnlyForDeploymentPostprocessing = 0;
53 | };
54 | /* End PBXFrameworksBuildPhase section */
55 |
56 | /* Begin PBXGroup section */
57 | D00325E920D4290900D84D0D = {
58 | isa = PBXGroup;
59 | children = (
60 | D00325F420D4290900D84D0D /* SortingAlgorithms */,
61 | D00325F320D4290900D84D0D /* Products */,
62 | );
63 | sourceTree = "";
64 | };
65 | D00325F320D4290900D84D0D /* Products */ = {
66 | isa = PBXGroup;
67 | children = (
68 | D00325F220D4290900D84D0D /* SortingAlgorithms */,
69 | );
70 | name = Products;
71 | sourceTree = "";
72 | };
73 | D00325F420D4290900D84D0D /* SortingAlgorithms */ = {
74 | isa = PBXGroup;
75 | children = (
76 | D00325F520D4290900D84D0D /* main.swift */,
77 | D00325FC20D429A700D84D0D /* QuickSort.swift */,
78 | D00325FE20D42D2B00D84D0D /* SelectionSort.swift */,
79 | D0319FC120D5189100217AD1 /* BubleSort.swift */,
80 | D0319FC320D51E8200217AD1 /* ShakerSort.swift */,
81 | D003D1B52101D3AA005EA7E6 /* ShellSort.swift */,
82 | D096ACF32107D46E00D247C9 /* CountingSort.swift */,
83 | D09348F82115A9B3001859FD /* MergeSort.swift */,
84 | D09348FA2115B62F001859FD /* HeapSort.swift */,
85 | );
86 | path = SortingAlgorithms;
87 | sourceTree = "";
88 | };
89 | /* End PBXGroup section */
90 |
91 | /* Begin PBXNativeTarget section */
92 | D00325F120D4290900D84D0D /* SortingAlgorithms */ = {
93 | isa = PBXNativeTarget;
94 | buildConfigurationList = D00325F920D4290900D84D0D /* Build configuration list for PBXNativeTarget "SortingAlgorithms" */;
95 | buildPhases = (
96 | D00325EE20D4290900D84D0D /* Sources */,
97 | D00325EF20D4290900D84D0D /* Frameworks */,
98 | D00325F020D4290900D84D0D /* CopyFiles */,
99 | );
100 | buildRules = (
101 | );
102 | dependencies = (
103 | );
104 | name = SortingAlgorithms;
105 | productName = SortingAlgorithms;
106 | productReference = D00325F220D4290900D84D0D /* SortingAlgorithms */;
107 | productType = "com.apple.product-type.tool";
108 | };
109 | /* End PBXNativeTarget section */
110 |
111 | /* Begin PBXProject section */
112 | D00325EA20D4290900D84D0D /* Project object */ = {
113 | isa = PBXProject;
114 | attributes = {
115 | LastSwiftUpdateCheck = 0940;
116 | LastUpgradeCheck = 0940;
117 | ORGANIZATIONNAME = "MacBook Air";
118 | TargetAttributes = {
119 | D00325F120D4290900D84D0D = {
120 | CreatedOnToolsVersion = 9.4;
121 | };
122 | };
123 | };
124 | buildConfigurationList = D00325ED20D4290900D84D0D /* Build configuration list for PBXProject "SortingAlgorithms" */;
125 | compatibilityVersion = "Xcode 9.3";
126 | developmentRegion = en;
127 | hasScannedForEncodings = 0;
128 | knownRegions = (
129 | en,
130 | );
131 | mainGroup = D00325E920D4290900D84D0D;
132 | productRefGroup = D00325F320D4290900D84D0D /* Products */;
133 | projectDirPath = "";
134 | projectRoot = "";
135 | targets = (
136 | D00325F120D4290900D84D0D /* SortingAlgorithms */,
137 | );
138 | };
139 | /* End PBXProject section */
140 |
141 | /* Begin PBXSourcesBuildPhase section */
142 | D00325EE20D4290900D84D0D /* Sources */ = {
143 | isa = PBXSourcesBuildPhase;
144 | buildActionMask = 2147483647;
145 | files = (
146 | D003D1B62101D3AA005EA7E6 /* ShellSort.swift in Sources */,
147 | D0319FC420D51E8200217AD1 /* ShakerSort.swift in Sources */,
148 | D09348F92115A9B3001859FD /* MergeSort.swift in Sources */,
149 | D0319FC220D5189100217AD1 /* BubleSort.swift in Sources */,
150 | D096ACF42107D46E00D247C9 /* CountingSort.swift in Sources */,
151 | D00325F620D4290900D84D0D /* main.swift in Sources */,
152 | D00325FF20D42D2B00D84D0D /* SelectionSort.swift in Sources */,
153 | D09348FB2115B62F001859FD /* HeapSort.swift in Sources */,
154 | D00325FD20D429A700D84D0D /* QuickSort.swift in Sources */,
155 | );
156 | runOnlyForDeploymentPostprocessing = 0;
157 | };
158 | /* End PBXSourcesBuildPhase section */
159 |
160 | /* Begin XCBuildConfiguration section */
161 | D00325F720D4290900D84D0D /* Debug */ = {
162 | isa = XCBuildConfiguration;
163 | buildSettings = {
164 | ALWAYS_SEARCH_USER_PATHS = NO;
165 | CLANG_ANALYZER_NONNULL = YES;
166 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
167 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
168 | CLANG_CXX_LIBRARY = "libc++";
169 | CLANG_ENABLE_MODULES = YES;
170 | CLANG_ENABLE_OBJC_ARC = YES;
171 | CLANG_ENABLE_OBJC_WEAK = YES;
172 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
173 | CLANG_WARN_BOOL_CONVERSION = YES;
174 | CLANG_WARN_COMMA = YES;
175 | CLANG_WARN_CONSTANT_CONVERSION = YES;
176 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
177 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
178 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
179 | CLANG_WARN_EMPTY_BODY = YES;
180 | CLANG_WARN_ENUM_CONVERSION = YES;
181 | CLANG_WARN_INFINITE_RECURSION = YES;
182 | CLANG_WARN_INT_CONVERSION = YES;
183 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
184 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
185 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
186 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
187 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
188 | CLANG_WARN_STRICT_PROTOTYPES = YES;
189 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
190 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
191 | CLANG_WARN_UNREACHABLE_CODE = YES;
192 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
193 | CODE_SIGN_IDENTITY = "Mac Developer";
194 | COPY_PHASE_STRIP = NO;
195 | DEBUG_INFORMATION_FORMAT = dwarf;
196 | ENABLE_STRICT_OBJC_MSGSEND = YES;
197 | ENABLE_TESTABILITY = YES;
198 | GCC_C_LANGUAGE_STANDARD = gnu11;
199 | GCC_DYNAMIC_NO_PIC = NO;
200 | GCC_NO_COMMON_BLOCKS = YES;
201 | GCC_OPTIMIZATION_LEVEL = 0;
202 | GCC_PREPROCESSOR_DEFINITIONS = (
203 | "DEBUG=1",
204 | "$(inherited)",
205 | );
206 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
207 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
208 | GCC_WARN_UNDECLARED_SELECTOR = YES;
209 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
210 | GCC_WARN_UNUSED_FUNCTION = YES;
211 | GCC_WARN_UNUSED_VARIABLE = YES;
212 | MACOSX_DEPLOYMENT_TARGET = 10.13;
213 | MTL_ENABLE_DEBUG_INFO = YES;
214 | ONLY_ACTIVE_ARCH = YES;
215 | SDKROOT = macosx;
216 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
217 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
218 | };
219 | name = Debug;
220 | };
221 | D00325F820D4290900D84D0D /* Release */ = {
222 | isa = XCBuildConfiguration;
223 | buildSettings = {
224 | ALWAYS_SEARCH_USER_PATHS = NO;
225 | CLANG_ANALYZER_NONNULL = YES;
226 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
227 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
228 | CLANG_CXX_LIBRARY = "libc++";
229 | CLANG_ENABLE_MODULES = YES;
230 | CLANG_ENABLE_OBJC_ARC = YES;
231 | CLANG_ENABLE_OBJC_WEAK = YES;
232 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
233 | CLANG_WARN_BOOL_CONVERSION = YES;
234 | CLANG_WARN_COMMA = YES;
235 | CLANG_WARN_CONSTANT_CONVERSION = YES;
236 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
237 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
238 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
239 | CLANG_WARN_EMPTY_BODY = YES;
240 | CLANG_WARN_ENUM_CONVERSION = YES;
241 | CLANG_WARN_INFINITE_RECURSION = YES;
242 | CLANG_WARN_INT_CONVERSION = YES;
243 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
244 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
245 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
246 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
247 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
248 | CLANG_WARN_STRICT_PROTOTYPES = YES;
249 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
250 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
251 | CLANG_WARN_UNREACHABLE_CODE = YES;
252 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
253 | CODE_SIGN_IDENTITY = "Mac Developer";
254 | COPY_PHASE_STRIP = NO;
255 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
256 | ENABLE_NS_ASSERTIONS = NO;
257 | ENABLE_STRICT_OBJC_MSGSEND = YES;
258 | GCC_C_LANGUAGE_STANDARD = gnu11;
259 | GCC_NO_COMMON_BLOCKS = YES;
260 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
261 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
262 | GCC_WARN_UNDECLARED_SELECTOR = YES;
263 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
264 | GCC_WARN_UNUSED_FUNCTION = YES;
265 | GCC_WARN_UNUSED_VARIABLE = YES;
266 | MACOSX_DEPLOYMENT_TARGET = 10.13;
267 | MTL_ENABLE_DEBUG_INFO = NO;
268 | SDKROOT = macosx;
269 | SWIFT_COMPILATION_MODE = wholemodule;
270 | SWIFT_OPTIMIZATION_LEVEL = "-O";
271 | };
272 | name = Release;
273 | };
274 | D00325FA20D4290900D84D0D /* Debug */ = {
275 | isa = XCBuildConfiguration;
276 | buildSettings = {
277 | CODE_SIGN_STYLE = Automatic;
278 | DEVELOPMENT_TEAM = RN5J25X5C5;
279 | PRODUCT_NAME = "$(TARGET_NAME)";
280 | SWIFT_VERSION = 4.0;
281 | };
282 | name = Debug;
283 | };
284 | D00325FB20D4290900D84D0D /* Release */ = {
285 | isa = XCBuildConfiguration;
286 | buildSettings = {
287 | CODE_SIGN_STYLE = Automatic;
288 | DEVELOPMENT_TEAM = RN5J25X5C5;
289 | PRODUCT_NAME = "$(TARGET_NAME)";
290 | SWIFT_VERSION = 4.0;
291 | };
292 | name = Release;
293 | };
294 | /* End XCBuildConfiguration section */
295 |
296 | /* Begin XCConfigurationList section */
297 | D00325ED20D4290900D84D0D /* Build configuration list for PBXProject "SortingAlgorithms" */ = {
298 | isa = XCConfigurationList;
299 | buildConfigurations = (
300 | D00325F720D4290900D84D0D /* Debug */,
301 | D00325F820D4290900D84D0D /* Release */,
302 | );
303 | defaultConfigurationIsVisible = 0;
304 | defaultConfigurationName = Release;
305 | };
306 | D00325F920D4290900D84D0D /* Build configuration list for PBXNativeTarget "SortingAlgorithms" */ = {
307 | isa = XCConfigurationList;
308 | buildConfigurations = (
309 | D00325FA20D4290900D84D0D /* Debug */,
310 | D00325FB20D4290900D84D0D /* Release */,
311 | );
312 | defaultConfigurationIsVisible = 0;
313 | defaultConfigurationName = Release;
314 | };
315 | /* End XCConfigurationList section */
316 | };
317 | rootObject = D00325EA20D4290900D84D0D /* Project object */;
318 | }
319 |
--------------------------------------------------------------------------------
/SortingAlgorithms.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/SortingAlgorithms.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/SortingAlgorithms.xcodeproj/project.xcworkspace/xcuserdata/MacBookAir.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ava8/SortingAlgorithms/489a96ca7ffd87ec86c618b3f5357a8c878e44b8/SortingAlgorithms.xcodeproj/project.xcworkspace/xcuserdata/MacBookAir.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/SortingAlgorithms.xcodeproj/xcuserdata/MacBookAir.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
--------------------------------------------------------------------------------
/SortingAlgorithms.xcodeproj/xcuserdata/MacBookAir.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | SortingAlgorithms.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/SortingAlgorithms/BubleSort.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BubleSort.swift
3 | // SortingAlgorithms
4 | //
5 | // Created by MacBook Air on 16.06.2018.
6 | // Copyright © 2018 MacBook Air. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | func bubleSort(_ list: [T]) -> [T] {
12 | var sortList = list
13 |
14 | //алгоритм повторяется n-1 раз, где n - количество элементов в массиве
15 | for i in 0..<(sortList.count-1) {
16 | for j in 0..<(sortList.count-1-i) {
17 | //элемент массива сравнивается с последующим
18 | if sortList[j] > sortList[j+1] {
19 | //элементы меняются местами, таким образом:
20 | //"легкие" элементы перемещаются к началу списка
21 | //"тяжёлые" элементы - к концу списка
22 | sortList.swapAt(j, j+1)
23 | }
24 | }
25 | }
26 | return sortList
27 | }
28 |
29 |
--------------------------------------------------------------------------------
/SortingAlgorithms/CountingSort.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CountingSort.swift
3 | // SortingAlgorithms
4 | //
5 | // Created by MacBook Air on 25.07.2018.
6 | // Copyright © 2018 MacBook Air. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | // WARNING!
12 | // сортировка подсчётом работает только для массива из целочисленных чисел, которые больше нуля
13 | func countingSort(_ list: [Int]) -> [Int] {
14 | var sortList = list
15 |
16 | // находим максимальный элемент сортируемого массива
17 | let maxValue = list.max()
18 | // организуем массив размерностью: максимальный элемент + 1
19 | var container = Array(repeating: 0, count: maxValue! + 1)
20 |
21 | // проверяем на наличие отрицательных значений
22 | if list.contains(where: {$0 < 0}) {
23 | print("wrong input array: contains negative nums")
24 | print("\n")
25 | return list
26 | }
27 |
28 | // записываем в наш контейнер сколько раз повторяется каждое значение массива
29 | // например:
30 | // исходный массив: 0,8,3,1,10,4 максимальный эл-т: 10
31 | // контейнер, размерностью 10 :
32 | // [0]1,[1]1,[2]0,[3]1,[4]1,[5]0,[6]0,[7]0,[8]1,[9]0,[10]1
33 | // ***([индекс]значение)
34 | list.forEach({container[$0] += 1})
35 |
36 | var elem = 0
37 | // сортируем массив, исходя из значений в "контейнере"
38 | for i in 0.. {
16 | // куча
17 | var heap = [T]()
18 | // количество элементов в куче
19 | var size: Int {
20 | get {
21 | return heap.count
22 | }
23 | }
24 | var isEmpty: Bool {
25 | return heap.isEmpty
26 | }
27 |
28 | // пустая инициализация
29 | init() { }
30 | // инициализация с преобразованием в кучу массива
31 | init(array: [T]) {
32 | buildHeap(array)
33 | }
34 |
35 | // добавление элемента
36 | func insert(value: T) {
37 | heap.append(value)
38 | siftUp(size-1)
39 | }
40 |
41 | // удаление минимального элемента
42 | func extractMin() -> T? {
43 | guard !isEmpty else { return nil }
44 | guard size > 1 else { return heap.removeLast() }
45 | heap.swapAt(0, size-1)
46 | let root = heap.removeLast()
47 | siftDown(0)
48 | return root
49 | }
50 |
51 | // строим кучу из входного массива
52 | private func buildHeap(_ array: [T]) {
53 | self.heap = array
54 | for i in stride(from: size/2-1, through: 0, by: -1) {
55 | siftDown(i)
56 | }
57 | }
58 |
59 | // функции восстановления свойств кучи:
60 |
61 | // sift up - просеивание вверх
62 | // используем если значение измененного элемента уменьшается
63 | private func siftUp(_ index: Int) {
64 | var c = index // - child
65 | var p = parentIndex(child: c) // - parent
66 |
67 | while let parent = parent(child: c) {
68 | guard heap[c] < parent else { break }
69 | heap.swapAt(c, p)
70 | c = p
71 | p = parentIndex(child: c)
72 | }
73 | }
74 |
75 | // sift down - просеивание вниз
76 | // используем если значение измененного элемента увеличивается
77 | private func siftDown(_ index: Int) {
78 | var p = index
79 | while let max = minChild(parent: p) {
80 | guard heap[p] > max.child else { break }
81 | heap.swapAt(p, max.index)
82 | p = max.index
83 | }
84 | }
85 |
86 | // индекс родителя
87 | private func parentIndex(child: Int) -> Int {
88 | return child / 2 - 1
89 | }
90 | // индекс левого потомка
91 | private func leftIndex(parent: Int) -> Int {
92 | return parent * 2 + 1
93 | }
94 | // индекс правого потомка
95 | private func rightIndex(parent: Int) -> Int {
96 | return parent * 2 + 2
97 | }
98 |
99 | // возвращает родителя
100 | private func parent(child: Int) -> T? {
101 | let p = parentIndex(child: child)
102 | guard p >= 0 && p < heap.count else { return nil }
103 | return heap[p]
104 | }
105 | // возвращает левого потомка родителя
106 | private func left(parent: Int) -> T? {
107 | let l = leftIndex(parent: parent)
108 | guard l < heap.count else { return nil }
109 | return heap[l]
110 | }
111 | // возвращает правого потомка родителя
112 | private func right(parent: Int) -> T? {
113 | let r = rightIndex(parent: parent)
114 | guard r < heap.count else { return nil }
115 | return heap[r]
116 | }
117 |
118 | // находим минимальное значение потомка у родителя
119 | private func minChild(parent: Int) -> (child: T, index: Int)? {
120 |
121 | // если существуют оба потомка
122 | if let x = left(parent: parent), let y = right(parent: parent) {
123 | return x < y ?
124 | (child: x, index: leftIndex(parent: parent)) :
125 | (child: y, index: rightIndex(parent: parent))
126 | } else if let x = left(parent: parent) {
127 | // если существует только левый потомок
128 | return (child: x, index: leftIndex(parent: parent))
129 | } else if let y = right(parent: parent) {
130 | // если существует только правый потомок
131 | return (child: y, index: rightIndex(parent: parent))
132 | }
133 |
134 | return nil
135 | }
136 |
137 | }
138 |
139 | // собственно сама пирамидальная сортировка
140 |
141 | func heapSort(_ list: [T]) -> [T] {
142 | // делаем из массива кучу
143 | let heap = BinaryHeap(array: list)
144 | var sortList = [T]()
145 |
146 | // обходим нашу кучу
147 | while let min = heap.extractMin() {
148 | sortList.append(min)
149 | }
150 |
151 | return sortList
152 | }
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
--------------------------------------------------------------------------------
/SortingAlgorithms/MergeSort.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MergeSort.swift
3 | // SortingAlgorithms
4 | //
5 | // Created by MacBook Air on 04.08.2018.
6 | // Copyright © 2018 MacBook Air. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | func mergeSort(_ list: [T]) -> [T] {
12 | // если в нашем массиве больше, чем один элемент, то имеет смысл его сортировать
13 | if list.count > 1 {
14 |
15 | // находим средний элемент
16 | let mid = list.count / 2
17 | // делим массив на левую часть и правую
18 | let leftPart = Array(list[0.. 0 && dividedRight.count > 0 {
30 | if dividedLeft.first! < dividedRight.first! {
31 | merged.append(dividedLeft.removeFirst())
32 | } else {
33 | merged.append(dividedRight.removeFirst())
34 | }
35 | }
36 | return merged + dividedLeft + dividedRight
37 |
38 | } else {
39 | return list
40 | }
41 | }
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/SortingAlgorithms/QuickSort.swift:
--------------------------------------------------------------------------------
1 | //
2 | // QuickSort.swift
3 | // SortingAlgorithms
4 | //
5 | // Created by MacBook Air on 15.06.2018.
6 | // Copyright © 2018 MacBook Air. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 |
12 | func quickSort(_ list: [T]) -> [T] {
13 | // если в нашем массиве больше, чем один элемент, то имеет смысл его сортировать
14 | if list.count > 1 {
15 |
16 | //определяем опорный элемент - середина массива
17 | let pivot = list[0+(list.count - 0)/2]
18 |
19 | //создаём массив элементов меньших, чем опорный
20 | var less:[T] = []
21 | //создаём массив элементов эквивалентных опорному
22 | var equal:[T] = []
23 | //создаём массив элементов больших, чем опроный
24 | var greater:[T] = []
25 |
26 | //проходим по массиву и сортируем элементы по группам
27 | for element in list {
28 | if element < pivot {
29 | less.append(element)
30 | } else if element == pivot {
31 | equal.append(element)
32 | } else if element > pivot {
33 | greater.append(element)
34 | }
35 | }
36 | return quickSort(less) + equal + quickSort(greater)
37 | } else {
38 | return list
39 | }
40 | }
41 |
42 |
--------------------------------------------------------------------------------
/SortingAlgorithms/SelectionSort.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SelectionSort.swift
3 | // SortingAlgorithms
4 | //
5 | // Created by MacBook Air on 15.06.2018.
6 | // Copyright © 2018 MacBook Air. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | func selectionSort(_ list: [T]) -> [T] {
12 | var sortList = list
13 |
14 | //ищем минимальный элемент в массиве
15 | for i in sortList.indices {
16 | var min = i
17 | for j in i..(_ list: [T]) -> [T] {
12 | var sortList = list
13 |
14 | //левая и правая границы сортируемой области массива
15 | var leftIndex = 0
16 | var rightIndex = sortList.count-1
17 | //флаг наличия перемещений
18 | var flag : Bool
19 |
20 | //пока левая и правая границы цикла не замкнуться
21 | while leftIndex < rightIndex {
22 | flag = false
23 |
24 | //двигаемся слева направо
25 | for i in leftIndex.. sortList[i+1] {
28 | //меняем их местами
29 | sortList.swapAt(i+1, i)
30 | //перемещения есть
31 | flag = true
32 | }
33 | }
34 | //сдвигаем правую границу на предыдущий элемент
35 | rightIndex -= 1
36 |
37 | //проверяем есть ли премещения или массив уже отсротирован
38 | if flag == false {break}
39 |
40 | //двигаемся справа налево
41 | for i in (leftIndex.. sortList[i+1] {
44 | //меняем их местами
45 | sortList.swapAt(i, i+1)
46 | //перемещения есть
47 | flag = true
48 | }
49 | }
50 | //сдвигаем левую границу на следующий элемент
51 | leftIndex += 1
52 |
53 | //проверяем есть ли премещения или массив уже отсротирован
54 | if flag == false {break}
55 | }
56 | return sortList
57 | }
58 |
--------------------------------------------------------------------------------
/SortingAlgorithms/ShellSort.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ShellSort.swift
3 | // SortingAlgorithms
4 | //
5 | // Created by MacBook Air on 20.07.2018.
6 | // Copyright © 2018 MacBook Air. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | func shellSort(_ list: [T]) -> [T] {
12 | var sortList = list
13 |
14 | //сравнивать будем элементы, находящиеся друг от друга на некотором расстоянии
15 | var step = sortList.count/2
16 |
17 | // пока шаг не будет равен 1
18 | while step > 0 {
19 | //разбиваем исходный массив на группы из элементов отстоящих друг от друга на шаг
20 | for i in step..= step && sortList[j-step] > value {
26 | sortList[j] = sortList[j-step]
27 | j -= step
28 | }
29 | //после сравнения меняем местами элементы
30 | sortList[j] = value
31 | }
32 | //сокращаем шаг, тем самым уменьшая количество групп
33 | step /= 2
34 | }
35 | return sortList
36 | }
37 |
--------------------------------------------------------------------------------
/SortingAlgorithms/main.swift:
--------------------------------------------------------------------------------
1 | //
2 | // main.swift
3 | // SortingAlgorithms
4 | //
5 | // Created by MacBook Air on 15.06.2018.
6 | // Copyright © 2018 MacBook Air. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | var list1 = [1,9,4,5,1,0]
12 | var list2 = [9,3,-7,0,3]
13 | var list3 = [1,-2,3,-4,5,6,7,-8,9,10]
14 | var list4 = [10,9,8,7,6,5,4,3,2,1]
15 | var list5 = [0,1,2,3,4]
16 | var tmp = [356, 876, 0, 4, 378, 45, 23, 100, 36, 5, 1, 10, 67, 456, 342, 35, 21, 34, 68, 567, 234, 34, 1098]
17 |
18 | //создание рандомного массива пользовательского размера
19 | //print("Size of array: ", terminator:"");
20 | //let size = Int(readLine()!)!;
21 | //var arr = [UInt32]();
22 | //
23 | //for _ in 1 ... size {
24 | // arr.append(arc4random_uniform(100));
25 | //}
26 |
27 |
28 | // быстрые тесты сортировки
29 |
30 | print("быстрая сортировка:")
31 | print("исходный массив: \(list3)")
32 | print("отсортированный массив: \(quickSort(list3))")
33 | print("\n")
34 | print("сортировка выбором:")
35 | print("исходный массив: \(list3)")
36 | print("отсортированный массив: \(selectionSort(list3))")
37 | print("\n")
38 | print("пузырьковая сортировка:")
39 | print("исходный массив: \(list3)")
40 | print("отсортированный массив: \(bubleSort(list3))")
41 | print("\n")
42 | print("шейкерная сортировка:")
43 | print("исходный массив: \(list3)")
44 | print("отсортированный массив: \(shakerSort(list3))")
45 | print("\n")
46 | print("сортировка Шелла:")
47 | print("исходный массив: \(list3)")
48 | print("отсортированный массив: \(shellSort(list3))")
49 | print("\n")
50 | print("сортировка подсчётом:")
51 | print("исходный массив: \(list3)")
52 | print("отсортированный массив: \(countingSort(list2))")
53 | print("\n")
54 | print("сортировка слиянием:")
55 | print("исходный массив: \(list3)")
56 | print("отсортированный массив: \(mergeSort(list3))")
57 | print("\n")
58 | print("пирамидальная сортировка:")
59 | print("исходный массив: \(list3)")
60 | print("отсортированный массив: \(heapSort(list3))")
61 | print("\n")
62 |
63 |
64 | // временные тесты для сортировок
65 | /*
66 |
67 | func runningTime(f: @autoclosure () -> T) -> (result:T, duration: String) {
68 | let startTime = CFAbsoluteTimeGetCurrent()
69 | let result = f()
70 | let endTime = CFAbsoluteTimeGetCurrent()
71 | return (result, "время работы \(endTime - startTime) секунд")
72 | }
73 |
74 | var oneHundredArray: [Int] = []
75 | for _ in 0...99 {
76 | oneHundredArray.append(Int(arc4random_uniform(100)))
77 | }
78 | var oneThousnadArray: [Int] = []
79 | for _ in 0...999 {
80 | oneThousnadArray.append(Int(arc4random_uniform(100)))
81 | }
82 | var oneMillionArray: [Int] = []
83 | for _ in 0...999999 {
84 | oneMillionArray.append(Int(arc4random_uniform(100)))
85 | }
86 |
87 | print("тесты для массивов с 100 элементов")
88 | print("\n")
89 |
90 | print("быстрая сортировка:")
91 | print(runningTime(f: quickSort(oneHundredArray)).duration)
92 | print("сортировка выбором:")
93 | print(runningTime(f: selectionSort(oneHundredArray)).duration)
94 | print("пузырьковая сортировка:")
95 | print(runningTime(f: bubleSort(oneHundredArray)).duration)
96 | print("шейкерная сортировка:")
97 | print(runningTime(f: shakerSort(oneHundredArray)).duration)
98 | print("сортировка Шелла:")
99 | print(runningTime(f: shellSort(oneHundredArray)).duration)
100 | print("сортировка подсчётом:")
101 | print(runningTime(f: countingSort(oneHundredArray)).duration)
102 | print("сортировка слиянием:")
103 | print(runningTime(f: mergeSort(oneHundredArray)).duration)
104 | print("пирамидальная сортировка:")
105 | print(runningTime(f: heapSort(oneHundredArray)).duration)
106 | print("\n")
107 |
108 | print("тесты для массивов с 1000 элементов")
109 | print("\n")
110 |
111 | print("быстрая сортировка:")
112 | print(runningTime(f: quickSort(oneThousnadArray)).duration)
113 | print("сортировка выбором:")
114 | print(runningTime(f: selectionSort(oneThousnadArray)).duration)
115 | print("пузырьковая сортировка:")
116 | print(runningTime(f: bubleSort(oneThousnadArray)).duration)
117 | print("шейкерная сортировка:")
118 | print(runningTime(f: shakerSort(oneThousnadArray)).duration)
119 | print("сортировка Шелла:")
120 | print(runningTime(f: shellSort(oneThousnadArray)).duration)
121 | print("сортировка подсчётом:")
122 | print(runningTime(f: countingSort(oneThousnadArray)).duration)
123 | print("сортировка слиянием:")
124 | print(runningTime(f: mergeSort(oneThousnadArray)).duration)
125 | print("пирамидальная сортировка:")
126 | print(runningTime(f: heapSort(oneThousnadArray)).duration)
127 | print("\n")
128 |
129 | print("тесты для массивов с 1 000 000 элементов")
130 | print("\n")
131 |
132 | print("быстрая сортировка:")
133 | print(runningTime(f: quickSort(oneMillionArray)).duration)
134 | print("сортировка Шелла:")
135 | print(runningTime(f: shellSort(oneMillionArray)).duration)
136 | print("сортировка подсчётом:")
137 | print(runningTime(f: countingSort(oneMillionArray)).duration)
138 | print("пирамидальная сортировка:")
139 | print(runningTime(f: heapSort(oneMillionArray)).duration)
140 | print("сортировка слиянием:")
141 | print(runningTime(f: mergeSort(oneMillionArray)).duration)
142 | print("шейкерная сортировка:")
143 | print(runningTime(f: shakerSort(oneMillionArray)).duration)
144 | print("сортировка выбором:")
145 | print(runningTime(f: selectionSort(oneMillionArray)).duration)
146 | print("пузырьковая сортировка:")
147 | print(runningTime(f: bubleSort(oneMillionArray)).duration)
148 | print("\n")
149 |
150 | */
151 |
152 |
153 |
154 |
155 |
156 |
--------------------------------------------------------------------------------