插入和合并排序不适用于大数据集 C++
Insertion and Merge Sorts Does not Work on Big Data Sets C++
我一直在尝试为从文件中读取的数据集编写插入和合并排序。在测试我的代码时,我使用了一个小数据集(包括 6 个数字)并且我的程序运行完美。但是当我使用包含 1000000 个输入的更大数据集时,代码无法正常工作,我不明白为什么。我试图将向量的类型更改为 double 但它并没有解决问题。
预先感谢您的所有帮助。
我的数据集包含如下数字:512069、12823、11628
这是我的代码:
vector<int> readFile(string fileName);
void display(vector<int> &vector);
void insertionSort(vector<int> &vec);
vector<int> merge(vector<int> left, vector<int> right);
vector<int> mergeSort(vector<int> &m);
int main(int argc, const char * argv[]) {
string fileName;
cout<<"Enter input file name :";
cin>>fileName;
vector<int> numbersVec = readFile(fileName);
display(numbersVec);
cout<<"INSERTION SORT"<<"\n";
insertionSort(numbersVec);
display(numbersVec);
cout<<"MERGE SORT"<<"\n";
vector<int> neu = mergeSort(numbersVec);
display(neu);
return 0;
}
vector<int> readFile(string fileName){
vector<int> numbers;
ifstream in(fileName,std::ios::in);
if(!in.is_open())
{
cout << "File Cannot be Opened" << endl;
}
else{
int number;
while (in >> number) {
numbers.push_back(number);
}
}
in.close();
return numbers;
}
void display(vector<int> &vec) {
for(int i = 0; i < vec.size(); i++)
{
cout << vec[i] << " ";
}
cout << "\n" << endl;
}
void insertionSort(vector<int> &vec) {
long double i, j, tmp;
for (i = 1; i < vec.size(); i++) {
j = i;
while (j > 0 && vec[j - 1] > vec[j]) {
tmp = vec[j];
vec[j] = vec[j - 1];
vec[j - 1] = tmp;
j--;
}
}
}
vector<int> merge(vector<int> tmpl, vector<int> tmpr){
vector<int> res;
while ((int)tmpl.size() > 0 || (int)tmpr.size() > 0) {
if ((int)tmpl.size() > 0 && (int)tmpr.size() > 0) {
if ((int)tmpl.front() <= (int)tmpr.front()) {
res.push_back((int)tmpl.front());
tmpl.erase(tmpl.begin());
}
else {
res.push_back((int)tmpr.front());
tmpr.erase(tmpr.begin());
}
}
else if ((int)tmpl.size() > 0) {
for (int i = 0; i < (int)tmpl.size(); i++)
res.push_back(tmpl[i]);
break;
}
else if ((int)tmpr.size() > 0) {
for (int i = 0; i < (int)tmpr.size(); i++)
res.push_back(tmpr[i]);
break;
}
}
return res;
}
vector<int> mergeSort(vector<int> &vec)
{
if (vec.size() <= 1)
return vec;
vector<int> tmpl, tmpr, res;
int mid = ((int)vec.size()+ 1) / 2;
for (int i = 0; i < mid; i++) {
tmpl.push_back(vec[i]);
}
for (int i = mid; i < (int)vec.size(); i++) {
tmpr.push_back(vec[i]);
}
tmpl = mergeSort(tmpl);
tmpr = mergeSort(tmpr);
res = merge(tmpl, tmpr);
return res;
}
你的算法看起来不错。这只是一个复杂的问题。如果算一下插入排序算法的while
执行的次数,平均来说接近n(n-1)/2
,其中n
是你数据集的大小(见insertion sort).
如果 n=1.000.000,复杂度接近 500.000.000.000,这很长。
只需尝试在 main
中注释对 insertionSort
的调用,您的 main
函数应该提前结束。
请注意,即使您在 mergeSort
算法中执行(太多)多个 vector
副本,它也会提前终止。复杂度为 'n * log(n)'(参见 merge sort)。
我一直在尝试为从文件中读取的数据集编写插入和合并排序。在测试我的代码时,我使用了一个小数据集(包括 6 个数字)并且我的程序运行完美。但是当我使用包含 1000000 个输入的更大数据集时,代码无法正常工作,我不明白为什么。我试图将向量的类型更改为 double 但它并没有解决问题。 预先感谢您的所有帮助。
我的数据集包含如下数字:512069、12823、11628
这是我的代码:
vector<int> readFile(string fileName);
void display(vector<int> &vector);
void insertionSort(vector<int> &vec);
vector<int> merge(vector<int> left, vector<int> right);
vector<int> mergeSort(vector<int> &m);
int main(int argc, const char * argv[]) {
string fileName;
cout<<"Enter input file name :";
cin>>fileName;
vector<int> numbersVec = readFile(fileName);
display(numbersVec);
cout<<"INSERTION SORT"<<"\n";
insertionSort(numbersVec);
display(numbersVec);
cout<<"MERGE SORT"<<"\n";
vector<int> neu = mergeSort(numbersVec);
display(neu);
return 0;
}
vector<int> readFile(string fileName){
vector<int> numbers;
ifstream in(fileName,std::ios::in);
if(!in.is_open())
{
cout << "File Cannot be Opened" << endl;
}
else{
int number;
while (in >> number) {
numbers.push_back(number);
}
}
in.close();
return numbers;
}
void display(vector<int> &vec) {
for(int i = 0; i < vec.size(); i++)
{
cout << vec[i] << " ";
}
cout << "\n" << endl;
}
void insertionSort(vector<int> &vec) {
long double i, j, tmp;
for (i = 1; i < vec.size(); i++) {
j = i;
while (j > 0 && vec[j - 1] > vec[j]) {
tmp = vec[j];
vec[j] = vec[j - 1];
vec[j - 1] = tmp;
j--;
}
}
}
vector<int> merge(vector<int> tmpl, vector<int> tmpr){
vector<int> res;
while ((int)tmpl.size() > 0 || (int)tmpr.size() > 0) {
if ((int)tmpl.size() > 0 && (int)tmpr.size() > 0) {
if ((int)tmpl.front() <= (int)tmpr.front()) {
res.push_back((int)tmpl.front());
tmpl.erase(tmpl.begin());
}
else {
res.push_back((int)tmpr.front());
tmpr.erase(tmpr.begin());
}
}
else if ((int)tmpl.size() > 0) {
for (int i = 0; i < (int)tmpl.size(); i++)
res.push_back(tmpl[i]);
break;
}
else if ((int)tmpr.size() > 0) {
for (int i = 0; i < (int)tmpr.size(); i++)
res.push_back(tmpr[i]);
break;
}
}
return res;
}
vector<int> mergeSort(vector<int> &vec)
{
if (vec.size() <= 1)
return vec;
vector<int> tmpl, tmpr, res;
int mid = ((int)vec.size()+ 1) / 2;
for (int i = 0; i < mid; i++) {
tmpl.push_back(vec[i]);
}
for (int i = mid; i < (int)vec.size(); i++) {
tmpr.push_back(vec[i]);
}
tmpl = mergeSort(tmpl);
tmpr = mergeSort(tmpr);
res = merge(tmpl, tmpr);
return res;
}
你的算法看起来不错。这只是一个复杂的问题。如果算一下插入排序算法的while
执行的次数,平均来说接近n(n-1)/2
,其中n
是你数据集的大小(见insertion sort).
如果 n=1.000.000,复杂度接近 500.000.000.000,这很长。
只需尝试在 main
中注释对 insertionSort
的调用,您的 main
函数应该提前结束。
请注意,即使您在 mergeSort
算法中执行(太多)多个 vector
副本,它也会提前终止。复杂度为 'n * log(n)'(参见 merge sort)。