= std::pair<RandomIt, RandomIt>;
template <typename RandomIt>
requires std::random_access_iterator<RandomIt>
Indexes<RandomIt> Partition(RandomIt start, RandomIt end, RandomIt pivot) {
RandomIt pivot_start = start;
RandomIt iter = start;
RandomIt pivot_end = end;
while (iter <= pivot_end) {
if (*iter < *pivot) {
std::swap(*pivot_start, *iter);
++pivot_start;
++iter;
} else if (*iter > *pivot) {
std::swap(*iter, *pivot_end);
--pivot_end;
} else {
++iter;
}
}
return std::make_pair(pivot_start, pivot_end);
}
template <typename RandomIt>
requires std::random_access_iterator<RandomIt>
void NonQuickSort(RandomIt start, RandomIt end) {
if (start >= end) {
return;
}
Indexes<RandomIt> pivot_borders = Partition(start, end, start);
NonQuickSort(start, pivot_borders.first - 1);
NonQuickSort(pivot_borders.second + 1, end);
}
template <typename RandomIt>
requires std::random_access_iterator<RandomIt>
RandomIt GetMedian(RandomIt start, RandomIt end) {
Vector tmp(start, end + 1);
NonQuickSort(tmp.begin(), tmp.end() - 1);
size_t median_index =
tmp.size() % 2 == 1 ? tmp.size() / 2 : tmp.size() / 2 - 1;
return tmp.begin() + median_index;
}
template <typename RandomIt>
requires std::random_access_iterator<RandomIt>
RandomIt QuickSelect(RandomIt start, RandomIt end, int32_t kth) {
if (start == end) {
return start;
}
int32_t fiver_cont = (end - start + 1) / 5;
if ((end - start + 1) % 5 != 0) {
++fiver_cont;
}
std::vector<RandomIt> medians;
medians.reserve(fiver_cont);
RandomIt index = start;
while (index + 5 < end) {
medians.push_back(GetMedian(index, index + 4));
index += 5;
}
medians.push_back(GetMedian(index, end));
RandomIt median =
QuickSelect(medians.begin(), (medians.end() - 1), (medians.size() - 1) / 2);
Indexes<RandomIt> pivot_borders = Partition(start, end, median);
if (kth <= pivot_borders.first - start) {
return QuickSelect(start, pivot_borders.first, kth);
}
if (kth <= pivot_borders.second - start) {
return median;
}
return QuickSelect(pivot_borders.second + 1, end,
kth - (pivot_borders.second - start + 1));
}
template <typename RandomIt>
requires std::random_access_iterator<RandomIt>
void QuickSort(RandomIt start, RandomIt end) {
if (start >= end) {
return;
}
size_t median_index = (end - start + 1) % 2 == 1 ? (end - start + 1) / 2
: (end - start + 1) / 2 - 1;
RandomIt pivot = QuickSelect(start, end, median_index);
Indexes<RandomIt> pivot_borders = Partition(start, end, pivot);
QuickSort(start, pivot_borders.first - 1);
QuickSort(pivot_borders.second + 1, end);
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
int32_t count;
std::cin >> count;
Vector nums(count);
for (int32_t i = 0; i < count; ++i) {
std::cin >> nums[i];
}
QuickSort(nums.begin(), nums.end()- 1);
for (int32_t i = 0; i < count; ++i) {
std::cout << nums[i] << ' ';
}
}
Почему не компилируется код? Огромное полотно логов
Может, не тот стандарт языка выбрал? main.cpp:6:1 : note: ‘requires’ only available with ‘-std=c++20’ or ‘-fconcepts’ main.cpp:10:1: error: ‘requires’ does not name a type
Да вроде тот: -std=c++20
компилятор видит твоё полотно кода и принял вызов
На onlinegbd твой код Compile Time Exceed).
Смотри на первую ошибку
Обсуждают сегодня