2013-09-23 3 views
0

Я пытаюсь сделать программу сортировки вставки/слияния, делает и то и другое, и ей необходимо принимать вложения до 10 миллионов серийных массивов. Для сортировки слияния это нормально, и для его сортировки требуется несколько секунд, но для вставки требуется, по словам моих друзей, более 6 часов. Я хотел бы включить таймер в программу, чтобы он просто остановился после 30 минут работы и не стал делать это с сортировкой, но я не уверен, как, или где бы я это сказал.Как отключить программу, если она слишком долго заканчивается?

Heres мой код для моего основного метода и вставки сортировки, поскольку его единственный, который нуждается в таймере. Кто-нибудь знает, что делать или с чего начать?

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; 
} 
+1

Какая операционная система? – Duck

+0

6 часов? Это задание? Если это так, возможно, вы делаете что-то очень не так. –

ответ

0

В зависимости от вашей системы OS вы можете настроить специальные среды для вашей программы, чтобы запустить в таком, что если он занимает слишком много времени (или другие условия) программа будет завершена. В качестве альтернативы вы можете создать поток, который просто отсчитывает столько, сколько захотите. Если он заканчивается и основной поток все еще работает, вы можете убить программу оттуда.

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--; 
    } 
0

Самый простой способ осуществить синхронизированную функцию обратного вызова. Эта функция будет вызываться после указанного интервала времени, и вы можете выйти из программы внутри этой функции.

Более подробную информацию о том, как осуществить это, можно найти в следующей ссылке

c++ Implementing Timed Callback function

Смежные вопросы