这几天都是发癫写的
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cmath> // for sqrt
// Gen-Sort 实现(保持不变)
void genSort(std::vector<int>& arr) {
if (arr.empty()) return;
int min_val = *std::min_element(arr.begin(), arr.end());
int max_val = *std::max_element(arr.begin(), arr.end());
std::unordered_map<int, int> count_map;
for (int num : arr) count_map[num]++;
arr.clear();
for (int i = min_val; i <= max_val; ++i) {
if (count_map.find(i) != count_map.end()) {
arr.insert(arr.end(), count_map[i], i);
}
}
}
// 自适应分块 Merge-Plus
void adaptiveMergePlus(std::vector<int>& arr) {
if (arr.size() <= 1) return;
// 1. 动态计算分块数量(例如分块数 k = sqrt(n))
size_t n = arr.size();
size_t k = static_cast<size_t>(std::sqrt(n));
size_t block_size = n / k + (n % k != 0);
// 2. 分块并用 Gen-Sort 排序
std::vector<std::vector<int>> blocks(k);
for (size_t i = 0; i < k; ++i) {
size_t start = i * block_size;
size_t end = std::min(start + block_size, n);
blocks[i] = std::vector<int>(arr.begin() + start, arr.begin() + end);
genSort(blocks[i]); // 对每个分块排序
}
// 3. 多路归并(使用优先队列)
arr.clear();
using BlockIterator = std::vector<int>::const_iterator;
using QueueItem = std::pair<BlockIterator, BlockIterator>;
auto cmp = [](const QueueItem& a, const QueueItem& b) {
return *a.first > *b.first; // 最小堆
};
std::priority_queue<QueueItem, std::vector<QueueItem>, decltype(cmp)> pq(cmp);
// 初始化堆
for (const auto& block : blocks) {
if (!block.empty()) {
pq.push({block.begin(), block.end()});
}
}
// 归并
while (!pq.empty()) {
auto [begin, end] = pq.top();
pq.pop();
arr.push_back(*begin);
if (++begin != end) {
pq.push({begin, end});
}
}
}
int main() {
std::vector<int> arr = {5, 3, 8, 1, 2, 7, 4, 10, 3, 5, 6, 9, 0, 11};
std::cout << "Original array: ";
for (int num : arr) std::cout << num << " ";
std::cout << "\n";
adaptiveMergePlus(arr);
std::cout << "Sorted array: ";
for (int num : arr) std::cout << num << " ";
std::cout << "\n";
return 0;
}使用了AI 不然一天打两千行代码我手能不要了