我正在尝试进行插入/合并排序程序,两者都做,并且它需要接受高达1000万个系列长数组的输入。对于合并排序很好,它需要几秒钟来排序,但根据我的朋友,它应该需要超过6小时的插入。我想把一个计时器放到程序中,让它在工作30分钟后停止,而不是以某种方式完成排序,但我不确定如何,或者我会把它放在哪里。
我的主要方法和插入排序的代码,因为它是唯一需要计时器的代码。任何人都知道该做什么或从哪里开始?
void insertionSort(int arr[], int length) {
int i, j, tmp;
for (i = 1; i < length; i++) {
j = i;
while (j > 0 && arr[j - 1] > arr[j]) {
tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
j--;
}
}
}
int main()
{
srand (time(0));
long x;
cout << "how long will the array be?\n" <<
"10, 100, 1000, 10000, 100000, 1000000, or 10000000?" << endl;
cin >> x;
switch(x){
case 10:
x = 10;
break;
case 100:
x = 100;
break;
case 1000:
x = 1000;
break;
case 10000:
x = 10000;
break;
case 100000:
x = 100000;
break;
case 1000000:
x = 1000000;
break;
case 10000000:
x = 10000000;
break;
default:
cout << "Error, incorrect number entered, please try again!" << endl;
}
static int ar[10000000];
for(int i = 0; i < x; i++){
ar[i] = rand() % 100000001;
}
int c= 0;
cout << "which sorting method would you like to use?\n" <<
"Insertion(1), merge(2), or quick(3)? \nPlease enter the number beside the one you want to use" << endl;
cin >> c;
if(c == 1){
insertionSort(ar, x);
}
else if(c==2){
for (int i = 1; i < x; i *= 2) {
for (int j = 0; j < x- i; j += 2*i) {
int iEnd2 = (2*i < x - j) ? 2*i : x - j;
Merge(&(ar[j]), i, iEnd2);
}
}
} else if(c==3){
quickSort(ar,0,x-1);
} else{
cout << "You did not enter a correct number, please try again" << endl;
}
for(int i = 0; i < x; i++){
cout << ar[i] << endl;
}
return 0;
}
答案 0 :(得分:0)
根据您的操作系统,您可以为程序设置特殊环境,以便在程序耗时过长(或其他条件)时程序将终止。或者,你可以生成一个只要你想要的倒计时的线程。如果它完成并且主线程仍在运行,则可以从那里终止程序。
答案 1 :(得分:0)
我可以轻松地使用ctime
模块来实现:
#include <ctime>
#define HALF_HOUR 60 * 30
using namespace std;
...
clock_t start = clock();
clock_t now;
int i, j, tmp;
for (i = 1; i < length; i++) {
j = i;
while (j > 0 && arr[j - 1] > arr[j]) {
now = clock();
if ((now - start) / CLOCKS_PER_SEC) >= HALF_HOUR)
{
cout << "Insert sort timed out." << endl;
return;
}
tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
j--;
}
答案 2 :(得分:0)
最简单的方法是实现定时回调函数。该函数将在指定的时间间隔后调用,您可以退出该函数内的程序。
有关如何实施它的更多信息,请参阅以下链接