MCPcopy Create free account
hub / github.com/chronoxor/CppBenchmark / MergeSort

Class MergeSort

examples/sort.cpp:246–306  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

244};
245
246class MergeSort : public CppBenchmark::Benchmark, public SortFixture
247{
248public:
249 using Benchmark::Benchmark;
250
251protected:
252 void Run(CppBenchmark::Context& context) override
253 {
254 // Generate items to sort
255 std::generate(items.begin(), items.end(), rand);
256
257 // Use temporary array
258 std::vector<int> temp(items.size());
259
260 // Start from the chunk size 1
261 size_t chunk = 1;
262 // While chunk size less than count of items
263 while (chunk < items.size())
264 {
265 // Perform merge operation for the current chunks
266 for (size_t i = 0; i < items.size(); i += 2 * chunk)
267 MergeSortInternal(temp.data() + i, items.data() + i, i, items.size(), chunk);
268 // Increase chunk size
269 chunk *= 2;
270 // Swap arrays
271 std::swap(temp, items);
272 }
273 context.metrics().AddItems(items.size());
274 }
275
276private:
277 static void MergeSortInternal(int* dst, int* src, size_t index, size_t size, size_t chunk)
278 {
279 size_t index1 = 0;
280 size_t index2 = 0;
281
282 while ((index1 < chunk) || (index2 < chunk))
283 {
284 // Check bounds of left chunk
285 if ((index + index1 >= size))
286 index1 = chunk;
287 // Check bounds of right chunk
288 if (index + chunk + index2 >= size)
289 index2 = chunk;
290
291 // Check if we use right or left chunk for merge
292 if ((index2 < chunk) && ((index1 == chunk) || (src[chunk + index2] < src[index1])))
293 {
294 // Use right chunk
295 *dst++ = src[chunk + index2];
296 ++index2;
297 }
298 else if (index1 < chunk)
299 {
300 // Use left chunk
301 *dst++ = src[index1];
302 ++index1;
303 }

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected