Я разработал алгоритмы сортировки вставкой и быстрой сортировки на C ++.Теперь я намерен создать как минимум четыре варианта алгоритма быстрой сортировки.Они будут различаться в зависимости от того, как они выбирают сводку и используют ли они сортировку вставки для небольших списков или нет.В Java или C #, чтобы избежать дублирования кода и противоречивых имен, я бы реализовывал каждую версию алгоритма Quicksort в отдельном файле класса и использовал наследование.В частности, я бы создал следующие классы:
QuicksortFixedPivot
QuicksortRandomPivot
QuicksortFixedPivotInsertion
- подмассивы с не более k
элементами отсортированыиспользуя сортировку вставкой QuicksortRandomPivotInsertion
Однако из моего понимания «автономные» алгоритмы, такие как Quicksort, обычно не реализуются в классах в C ++.
Ниже приведен мойначальная реализация Quicksort.
quicksort.hpp
#pragma once
#include <vector>
namespace algorithms
{
void quicksort(std::vector<int> &list);
void quicksort(std::vector<int> &list, int left, int right);
int partition(std::vector<int> &list, int left, int right);
}
quicksort.cpp
#include "quicksort.hpp"
namespace alg = algorithms;
void alg::quicksort(std::vector<int> &list)
{
alg::quicksort(list, 0, list.size() - 1);
}
void alg::quicksort(std::vector<int> &list, int left, int right)
{
if (left >= right)
return;
int oldPivot = alg::partition(list, left, right);
alg::quicksort(list, left, oldPivot - 1);
alg::quicksort(list, oldPivot + 1, right);
}
int alg::partition(std::vector<int> &list, int left, int right)
{
int pivot = list[left + (right-left)/2];
while (true)
{
while (list[left] < pivot)
left++;
while (list[right] > pivot)
right--;
if (left >= right)
return left;
std::swap(list[left], list[right]);
}
}
С вышеупомянутымИсходя из этого, у меня есть два вопроса.
Во-первых, для того, чтобы быть единственной реализацией Quicksort, правильно ли я использовал заголовочные файлы и правильно ли структурировал свой код?Например, хорошо ли, что алгоритм находится за пределами класса?
Во-вторых, как мне подходить к созданию разных версий этого алгоритма, избегая при этом дублирования кода и конфликтов имен?Например, должен ли я использовать классы или какую-либо другую языковую конструкцию?
Я был бы признателен, если бы ответ содержал минимальные фрагменты кода, поясняющие, как следует использовать любые подходящие языковые конструкции для достижения аккуратного кода.