用C++采用分治算法(时间复杂性为O(nlogn)),实现求最大子段和,并统计运行时间。
时间: 2024-12-10 21:42:58 浏览: 25
在C++中,可以使用分治算法(如Kadane's Algorithm)来解决寻找数组最大子段和的问题。这个算法的基本思想是将数组分成两部分,分别计算左半部分、右半部分以及跨越中间点的最大子段和,然后取这三个数中的最大值作为结果。
以下是使用递归实现的一个例子:
```cpp
#include <vector>
#include <chrono>
int maxSubarraySum(const std::vector<int>& nums) {
if (nums.empty()) return 0;
if (nums.size() == 1) return nums[0];
int mid = nums.size() / 2;
int leftMax = maxSubarraySum(nums.begin(), nums.begin() + mid);
int rightMax = maxSubarraySum(nums.begin() + mid, nums.end());
int crossMax = nums[mid] > 0 ? nums[mid] : 0;
for (size_t i = mid - 1; i >= 0; --i) {
crossMax = std::max(crossMax + nums[i], nums[i]);
}
return std::max(leftMax, std::max(rightMax, crossMax));
}
int main() {
std::vector<int> nums = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };
auto start = std::chrono::high_resolution_clock::now();
int result = maxSubarraySum(nums);
auto end = std::chrono::high_resolution_clock::now();
double time_spent = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() * 1e-6;
std::cout << "最大子段和: " << result << ", 运行时间: " << time_spent << "秒" << std::endl;
return 0;
}
```
在这个代码片段中,`maxSubarraySum`函数实现了分治策略,并返回最大子段和。`main`函数中首先初始化了一个测试数组,然后记录开始时间,调用函数并获取结果,最后计算并输出运行时间。
阅读全文