2015-02-21 4 views
-4

Я создал небольшую программу, которая объединяет два массива с использованием алгоритма сортировки слиянием, но на удивление прекращает работу при выполнении ... у него нет ошибок компиляции.C++, exe прекратил работу во время выполнения

#include<iostream> 
#include<array> 

using namespace std; 

int main() 

{ 
    // below are declarations of two single dimensional arrays and two variables 

    int n1,n2,t1,t2,t3; 
    int l1 [5] = {2,1,4,3,5}; 
    int l2 [5] = {8,6,7,9,10}; 
    int l3 [10]; 

    n1 = l1[4] - l1[0] +1; 
    n2 = l2[4] - l2[0] +1; 


    //below are the declaration and initialization of two pointers 

    t1 = l1[0]; 
    t2 = l2[0]; 
    t3 = l3[0]; 


     while((n1>0) && (n2>0)) 

    { 

     if (l1[t1] < l2[t2]) 
     { 

      l3[t3] = l1[t1]; 
      t1++; 
      t3++; 

      n1--; 
      cout<<l3[t3]<<endl; 

      } 
      else 
      l3[t3] = l2[t2]; 
      t2++; 
      t3++; 
      n2--; 

    } 

} 

Я до сих пор не решили, выход программы

+1

Запустите свой код под отладчиком, чтобы узнать, где произошло исключение. –

+0

Вы пропустили несколько скобок на своем? Я отредактировал форматирование так, чтобы ваш код был читабельным, но для меня это похоже на то, что у вас отсутствуют некоторые скобки. – drescherjm

+0

Возможно, все, что после 'else' должно быть в блоке' else'? – Blob

ответ

1

Вы очень путаются указателей. Это:

n1 = l1[4] - l1[0] + 1; 

принимает значение из l1[4], вычитает значение из l1[0], затем добавляет 1. Кажется, вы думаете, что l1[4] - l1[0] собирается дать вам количество элементов в массиве, меньше 1. То, что вы на самом деле хотите здесь:

n1 = sizeof l1/sizeof l1[0]; 

Кроме того, это:

t1 = l1[0]; 

не делает «указатель» - t1 это просто int, который содержит значение из l1[0], не это адрес. Как указано в комментариях, даже если это указатель, вы не сможете использовать его в качестве индекса. То, что вы на самом деле хотите это:

t1 = 0; 

Наконец, это:

while((n1 > 0) && (n2 > 0)) 

собирается прекратить после того, как сделать это только через одну из ваших массивов. Чего вы хотите:

while((n1 > 0) || (n2 > 0)) 

хотя это сломается, если l1 содержит какие-либо элементы, выше, чем l2.

Вот модифицированная версия вашей программы, которая реализует свой алгоритм:

#include <iostream> 

int main() 
{ 
    int l1[5] = {2, 1, 4, 3, 5}; 
    int l2[5] = {8, 6, 7, 9, 10}; 
    int l3[10] = {0}; 

    int n1 = sizeof l1/sizeof l1[0]; 
    int n2 = sizeof l2/sizeof l2[0]; 
    int t1 = 0, t2 = 0, t3 = 0; 

    while ((n1 > 0) || (n2 > 0)) { 
     if (l1[t1] < l2[t2]) { 
      l3[t3++] = l1[t1++]; 
      --n1; 
     } 
     else { 
      l3[t3++] = l2[t2++]; 
      --n2; 
     } 
    } 

    for (int i = 0; i < sizeof l3/sizeof l3[0]; ++i) { 
     std::cout << l3[i] << std::endl; 
    } 

    return 0; 
} 

с выходом:

[email protected]:~/src/sandbox$ ./ms 
2 
1 
4 
3 
5 
8 
6 
7 
9 
10 
[email protected]:~/src/sandbox$ 

Очевидно, как это реализовано, ваш алгоритм объединяет два списка, но если они не являются первоначально отсортированный, то вы не получите отсортированный список. Если вы хотите в итоге отсортировать список, то у вас есть еще одна работа. Кроме того, как отмечалось выше, ваш алгоритм вообще не будет работать правильно для большинства массивов.

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