#include <iostream>
#include <cmath>
#include <Windows.h>
#include <stdlib.h>
#include <fstream>
#include <time.h>
using namespace std;
int nums[12] = { 1,-2,4,5,-2,8,3,-2,6,3,7,-1 };
bool randNums(int n) {
fstream ofs("data.txt", ios::out | ios::trunc);
if (!ofs.is_open()) {
cout << "文件打开失败!" << endl;
return false;
}
ofs << n << ' ';
int temp = 0;
for (int i = 0; i < n; i++) {
temp = rand() % 200 - 100; //随机数在-100到100
ofs << temp << ' ';
}
return true;
}
int crossingSubArray(int nums[], int low, int mid, int height)
{
int sum = 0, sLeft = INT_MIN, sRight = INT_MIN;
//左边
for (int i = mid; i >= low; i--)
{
sum += nums[i];
if (sum > sLeft)
{ //
sLeft = sum;
}
}
//右边
sum = 0;
for (int i = mid+1; i <= height; i++)
{
sum += nums[i];
if (sum > sRight)
{ //
sRight = sum;
}
}
return (sLeft > sRight ? sLeft : sRight) > (sRight + sLeft) ?
(sLeft > sRight ? sLeft : sRight) : (sRight + sLeft);
}
int maxSubArray(int nums[],int low,int height)
{
if (low == height) //分成最后一个元素
{
return nums[low];
}
int mid = (int)floor ((height + low) / 2);
int S1 = maxSubArray(nums, low, mid);
int S2 = maxSubArray(nums, mid + 1, height);
int S3 = crossingSubArray(nums, low, mid, height);
return ((S1 > S2) ? S1 : S2) > S3 ? ((S1 > S2) ? S1 : S2) : S3;
}
int* readNums() {
fstream ifs("data.txt", ios::in);
int n;
ifs >> n;
int i = 0;
int* nums = new int[n];
while (ifs >> n) {
//cout << n << ' ';
nums[i++] = n;
}
cout << endl;
cout << endl;
return nums;
}
int main()
{
int n = 1000000; //次数修改 建议次数大于1000000+才有效果
srand((unsigned int)time(NULL));
if (!randNums(n)) {
return 0;
}
int* nums = readNums();
clock_t sTime, eTime;
sTime = clock();
ULONGLONG startTime= GetTickCount64();
cout << maxSubArray(nums, 0, n-1) << endl;
ULONGLONG endTime = GetTickCount64();
eTime = clock();
cout << "THe run time is:" << endTime - startTime << "ms" << endl;
cout << "THe run time is:" << (double)(eTime - sTime) / CLOCKS_PER_SEC << "s" << endl;
return 0;
}
06-06
174

04-02
1117

05-11
1289
