C++ 插入排序在一百万次输入后停止工作

C++ 插入排序在一百万次输入后停止工作,c++,algorithm,sorting,input,insertion-sort,C++,Algorithm,Sorting,Input,Insertion Sort,我已经实现了插入排序,我想这很好。它从一个文件中读取,并为输入10100100010000正确排序 然而,当我投入一百万的时候,它什么也没做。我甚至等了10分钟检查它是否太慢。 我动态地创建了我的数组,并尝试使用该数组进行合并排序。它在一百万输入下运行得很好,但我不明白为什么只有插入排序算法不能在一百万输入下运行 #include <iostream> #include <fstream> using namespace std; void InsertionSort

我已经实现了插入排序,我想这很好。它从一个文件中读取,并为输入10100100010000正确排序

然而,当我投入一百万的时候,它什么也没做。我甚至等了10分钟检查它是否太慢。
我动态地创建了我的数组,并尝试使用该数组进行合并排序。它在一百万输入下运行得很好,但我不明白为什么只有插入排序算法不能在一百万输入下运行

#include <iostream>
#include <fstream>

using namespace std;

void InsertionSort(int* array, int& size);
int main()
{
    int size;
    ifstream myfile("data.txt");
    myfile.open("data.txt");
    cout << "How many elements do you want to read" << endl;
    cin >> size;

    int* array = new int[size];
    for (int i = 0; i < size; i++) {
        myfile >> array[i];
    }

    InsertionSort(array, size);
    delete[] array;
}
void InsertionSort(int* array, int& size)
{
    int temp, j;

    for (int i = 1; i < size; i++) {
        j = i;
        while (j > 0 && array[j - 1] > array[j]) {
            temp = array[j];
            array[j] = array[j - 1];
            array[j - 1] = temp;
            j--;
        }
    }
}
#包括
#包括
使用名称空间std;
void InsertionSort(int*数组、int和size);
int main()
{
整数大小;
ifstream myfile(“data.txt”);
myfile.open(“data.txt”);
cout大小;
int*数组=新的int[大小];
对于(int i=0;i>数组[i];
}
InsertionSort(数组、大小);
删除[]数组;
}
void InsertionSort(int*数组、int和size)
{
内部温度,j;
对于(int i=1;i0&&array[j-1]>array[j]){
温度=阵列[j];
数组[j]=数组[j-1];
数组[j-1]=温度;
j--;
}
}
}

您的程序在O(n²)时间内运行,因为您有两个嵌套循环,它们都取决于输入的大小。因此,一旦从10000个元素增加到1000000个元素,您的程序将需要100²=一万倍的时间才能完成。此外,您的数据集以前可能适合处理器的缓存,但由于有100万个元素,它不再适合,因此这将进一步降低它的速度

O(n²)算法使事情变得非常缓慢,非常迅速。输入大小为10⁶, 这意味着您的程序将需要大约10½²的操作才能完成。假设您的处理器以10%的速度运行⁹ 最多每秒操作数,并且您的算法肯定会在每一步使用多个操作,您的程序需要10秒以上才能完成。

合并排序为O(n lg(n))。在最坏的情况下,插入排序平均为二次排序(不仅在最坏的情况下)。
差别是巨大的

假设你有两种算法,A和B

对于大小为n的任何输入,A进行n2次操作,而B进行n*lg(n)次操作

如果您将输入加倍,算法A将执行(2n)2=4n2操作-四倍的操作

B取2n*lg(2n)=2n*(lg(n)+1)=2n*lg(n)+2=2(n*lg(n)+1),这只是数量的两倍多一点

为了说明从10000个元素到1000000个元素之间的差异(为了简单起见,使用十个对数):

那是10000倍

10,000 * log(10,000) = 40,000
1,000,000 * log(1,000,000) = 6,000,000
这是150倍


因此,如果一万个案例所需的时间大致相同,那么对于一百万个案例,插入排序所需的时间将远长于合并排序。

在排序后尝试打印数组时,仍然需要显示一些输出。从来没有@G.SliepenThe算法不是按立方体增长的。@G.Rust假设存在三重循环:你怎么知道你等待的时间足够长?显然你没有等到节目结束。正如其他人已经告诉过你的,用O(n^3)从10K跑到1M要慢10000倍。好吧,我以前觉得它像一个MCVE。但是我调整了我的答案。仍然需要很多时间。@G.Rust只是向1Mio“缓慢”迭代。你会看到的。大约20万。然后300k等等,只要附加一个调试器,然后我猜,看看它能做什么。如果它仍然在您的排序例程中,则需要很长时间。或者让它运行几个小时,稍后再查看。@Hayt谢谢,我会试试的。希望大家都像你一样善良。在这里,每个人都在努力证明自己,而不是帮助别人anyone@G.RustFWIW,我认为你的问题适合这样做。如果你想让人们给你提示/最佳实践,我邀请你参加。否则,请继续在此处发布。:)我不明白这为什么会被否决。当然,代码不是最好的,帖子可以使用一些格式,但问题本身对我来说似乎是合理的。@GManNickG这样认为,但他们认为这是无用的,因此暂时禁止我提问。。
10,000 * log(10,000) = 40,000
1,000,000 * log(1,000,000) = 6,000,000