2013-09-24 2 views
0

Я пытаюсь написать программу, которая берет ввод определенной суммы продаж и выполняет некоторые вычисления на основе трех планов оплаты. Одна из вещей, которую я хочу внести, - это способ выяснить медианную из трех планов. Поэтому, если plan1 = 200, plan2 = 250 и plan3 = 300, я хочу, чтобы компьютер знал, что медиана равна 250. Если кто-то может помочь мне с помощью алгоритма или встроенной функции, я был бы очень признателен.Сортировка массива из трех элементов

+0

Там нет такой функции в стандартной библиотеке C, так что вы, вероятно, хотите, чтобы придумать свой собственный для реализации. – overloading

ответ

3
int ra[3] = { plan1, plan2, plan3 }; 
std::sort(ra, ra+3); 
return ra[1]; 

Может быть, вероятно, сделать более эффективно - то снова, если вы действительно повезло, что компилятор может оптимизировать его для вас.

Код, который "должен" быть более эффективными, вероятно, будет больше, например:

if (plan1 < plan2) { 
    if (plan2 < plan3) return plan2; 
    // plan2 is the biggest 
    return max(plan1, plan3); 
} else { 
    if (plan1 < plan3) return plan1; 
    // plan1 is the biggest 
    return max(plan2, plan3); 
} 

Другая возможность:

void order(int &first, int &second) { 
    if (second < first) std::swap(first, second); 
} 

order(plan1, plan2); 
order(plan2, plan3); 
order(plan1, plan2); 
return plan2; 
+0

В: Как можно сказать системному программисту от прикладного программиста? A: Системный программист предполагает, что все данные состоят из целых чисел, даже планов оплаты. :) – Michael

+1

@Michael: heh. Фактически произошло то, что я обычно писал функцию шаблона, но полагал, что это слишком сложно для вопрошающего, который не может понять это, и вызовет больше проблем, чем решает. В любом случае, денежные значения * должны * быть целыми числами, хотя и выражены в тысячах пенни ;-) –

+0

Спасибо за ответ, однако, std :: sort, похоже, не является допустимой функцией. У меня есть что-то, называемое std :: qsort, но оно выглядит совсем другим. – emufossum13

0
int median(int plan1, int plan2, int plan3) { 
    if (plan1 <= plan2 && plan1 >= plan3 || plan1 <= plan3 && plan1 >= plan2) return plan1; 
    if (plan2 <= plan1 && plan2 >= plan3 || plan2 <= plan3 && plan2 >= plan1) return plan2; 
    return plan3; 
} 
0

Это запутаться, но это может помочь вам продумайте алгоритм.

Как вы можете заказать три номера? Начните с сравнения двух из них, а затем сравните третий, пока не узнаете, где он находится. Это потребует много операторов if, но покажет вам базовый алгоритм. (Вы также можете использовать любой различные функции сортировки, но так как у вас есть только три элемента, то стоит продумать)

int findMedian(int num1, int num2, int num3) { 
    if (num1 < num2) { 
     if (num2 < num3) { 
      // the order is then num1, num2, num3 
      return num2; 
     } else { 
      // We know num1 is < num2 and num3 is < num2, but don't know 
      // where num1 and num3 go: num1, num3, num2 or num3, num1, num2? 
      if (num1 < num3) { 
       // now we know: num1, num3, num2 
       return num3; 
      } else { 
       // num3, num1, num2 
       return num1; 
      } 
     } 
    } else { 
     if (num2 < num3) { 
      // We know num2 < num1 and num2 < num3, but don't know where num1 
      // and num3 go: num2, num1, num3 or num2, num3, num1? 
      if (num1 < num3) { 
       // now we know: num2, num1, num3 
       return num1; 
      } else { 
       // num2, num3, num1; 
       return num3; 
      } 
     } else { 
      // We know num2 < num1 and num3 < num2, so num3, num2, num1 
      return num2; 
     } 
    } 
} 

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

int findMedian(int num1, int num2, int num3) { 
    if (num1 < num2) { 
     if (num2 < num3) { 
      return num2; 
     } else { 
      return (num1 < num3) ? num3 : num1; 
     } 
    } else { 
     if (num2 < num3) { 
      return (num1 < num3) ? num1 : num3; 
     } else { 
      return num2; 
     } 
    } 
} 

Если мы хотим пожертвовать читаемость, мы можем конденсировать его дальше:

int findMedian(int num1, int num2, int num3) { 
    if (num1 < num2) { 
     return (num2 < num3) ? num2 : (num1 < num3) ? num3 : num1; 
    } else { 
     return (num2 < num3) ? (num1 < num3) ? num1 : num3 : num2; 
    } 
} 

Или, мы можем принять его окончательный некрасивый шаг и в конечном итоге с одной строкой:

int findMedian(int num1, int num2, int num3) { 
    return (num1 < num2) ?(num2 < num3) ? num2 : (num1 < num3) ? num3 : num1 : (num2 < num3) ? (num1 < num3) ? num1 : num3 : num2; 
} 
Смежные вопросы