2015-11-20 2 views
-2

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

int i, j, k; 
    int *x = malloc(n * sizeof (int)); 
    for (i = 0, j = m, k = 0; k < n; k++) { 
     x[k] = j == n  ? a[i++] 
      : i == m  ? a[j++] 
      : a[j] < a[i] ? a[j++] 
      :    a[i++]; 
    } 
    free(x); 

ответ

2

Это эквивалентно:

for (i = 0, j = m, k = 0; k < n; k++) { 
     if (j == n) x[k] = a[i++]; 
     else if (i == m) x[k] = a[j++]; 
     else if (a[j] < a[i]) x[k] = a[j++]; 
     else x[k] = a[i++]; 
    } 
+0

спасибо. это именно то, что я спрашивал. – zyzz

1

вы можете переписать этот код:

if (j == n) 
    x[k] = a[i++]; 
else if (i == m) 
    x[k] = a[j++]; 
else if (a[j] < a[i]) 
    x[k] = a[j++]; 
else 
    x[k] = a[i++]; 

это выглядит как часть merge sort algorithm

+0

+1 для распознавания этого как слияния. Однако я наблюдаю, что слияние является спорным, потому что 'x' освобождается сразу после цикла. –

0

м и п переменных, которые имеют предположительно были заданы заранее и являются целыми неотрицательными значениями, а x и a - это массивы, которые должны (должны быть) en. В случае с [] он предположительно имеет какое-то содержательное содержимое, и это содержимое вместе со значениями m и n определит, что x [] заполняется или обновляется.

Цель петли абсолютно непрозрачна для меня. Что он делает:

Sets я до 0, J т и к к 0. Looping от K == 0 до к == (п-1) включительно

Наборы х [K] к следующее:

  • , если J равен п: а [I], затем увеличивает I
  • , если J не является н:
    • , если я равна т: а [ J], затем увеличивает J
    • , если я не м:
      • если значение на [J] меньше, чем значение в точке а [I]: а [J], затем увеличивает J
      • , если значение в [I], не меньше, чем значение в а [I]: а [I], затем увеличивает я

Когда цикл закончен, x [0] до x [n-1] будет заполнен значениями изнутри [] на основе содержимого a и значений m и n.

0

Я предполагаю, что у вас возникли проблемы с расшифровкой этого кода:

x[k] = j == n  ? a[i++] 
    : i == m  ? a[j++] 
    : a[j] < a[i] ? a[j++] 
    :    a[i++]; 

Предполагая, что это так, это условный оператор, который - как показывает VSync - очень похож на if-else заявление.По существу, это утверждение следует рассматривать как:

condition ? valueIfTrue : valueIfFalse; 

Это, оказывается аутов, очень похожи, но отличаются от:

if (condition) 
    statementIfTrue; 
else 
    statementIfFalse; 

Разница заключается в том, что условный оператор всегда приводит к значению, который может быть присвоен переменной, в противном случае используется в операции, передается как аргумент и т. Д. Для утверждения эквивалентного оператора if-then эти два блока операторов должны включать назначение.

И, наконец, существует множество условных операций, в которых valueIfFalse разрешается с другой условной операцией.