Более простой способ сортировки трех чисел

Есть ли более простой и лучший способ решить эту проблему, потому что

  • Я использовал слишком много переменных.
  • Я использовал множество операторов if else
  • Я сделал это с использованием метода грубой силы

Напишите программу, которая получает три целых числа в качестве входных данных и выводит числа в порядке возрастания.
Не используйте loop/array.

#include <stdio.h>
main(){
   int no1;
   int no2;
   int no3;
   int sto;
   int hi;
   int lo;

   printf("Enter No. 1: ");
   scanf("%d", &no1);
   printf("Enter No. 2: ");
   scanf("%d", &no2);         
   printf("Enter No. 3: ");
   scanf("%d", &no3);

   if (no1>no2) {   
      sto=no1;    
      lo=no2;   
   } else {
      sto=no2;  
      lo=no1;  
   } 
   if (sto>no3) { 
      hi=sto;    
      if(lo>no3){         
         sto=lo;                
         lo=no3;
      }else {
         sto=no3;      
      }         
   }else hi=no3; 

   printf("LOWEST %d\n", lo);
   printf("MIDDLE %d\n", sto);
   printf("HIGHEST %d\n", hi);  

   getch(); 
}    

Ответ 1

if (a > c)
   swap(a, c)

if (a > b)
   swap(a, b)

//Now the smallest element is the first one. Just check the 2-nd and 3-rd

if (b > c)
   swap(b, c);

Примечание: своп изменяет значения двух переменные.

Ответ 2

Вызовите три переменные x, y и z, затем:

if (x > y) swap(x, y);
if (y > z) swap(y, z)
if (x > y) swap(x, y);

Запись функции swap оставлена ​​в качестве упражнения для читателя. Подсказка: вам, возможно, придется использовать указатели.

Ответ 3

#include <stdio.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
int main(){
   int a, b, c;
   int hi;
   int lo;

   printf("Enter No. 1: ");
   scanf("%d", &a);
   printf("Enter No. 2: ");
   scanf("%d", &b);         
   printf("Enter No. 3: ");
   scanf("%d", &c);

   lo = min(min(a, b), c);
   hi = max(max(a, b), c);
   printf("LOWEST %d\n", lo);
   printf("MIDDLE %d\n", a+b+c-lo-hi);
   printf("HIGHEST %d\n", hi);  

   getchar(); 
}    

Ответ 4

Подсказка: если у вас есть 3 числа, a, b и c, min (a, min (b, c)) является наименьшим, max (a, max (b, c)) является наибольшим, и данный наименьшее и самое большое число, нужно будет найти третий.

Ответ 5

Да, есть намного лучший способ, но вам нужно использовать циклы и массивы.

Возможно, для вводного класса ваш ответ - это ответ, который они ищут.

Есть способы получить цикл с for/while (рекурсия, goto и т.д.). И способы получить что-то вроде массива без индексации (int *ptr = malloc (3 * sizeof(int)), а затем индексировать с помощью *(ptr+index)). Но мне трудно думать, что это то, чего они хотят.

Ответ 6

Чтобы найти минимальное, среднее и максимальное значения 3, вы можете использовать тернарный оператор. Вы можете либо выполнить всю свою работу в основной части вашего кода, либо вы можете разделить вычисления minof3, midof3 и maxof3 на функции повторного использования.

В случае min и max вы просто делаете 2 из 3 возможных сравнений, а затем возвращаете сравнение результатов. В случае середины вы делаете то же самое, но вычисляете min и max из трех значений, а затем проверяете все 3 против min и max, чтобы найти значение, которое не является ни минимальным, ни макс. (вы можете сделать эту часть в основной части вашего кода без дополнительной функции, объявив значения min и max в качестве переменных и выполнив их там).

Объединяя фрагменты, вы можете сделать что-то похожее на следующее, которое принимает первые 3 аргумента в качестве значений для сортировки (или использует значения по умолчанию для 99, 231, 8, если необходимое значение не указано)

#include <stdio.h>
#include <stdlib.h>

/** direct ternary comparison of 3 values */
long minof3 (long a, long b, long c) {
    long x = a < b ? a : b,
         y = a < c ? a : c;
    return x < y ? x : y;
}

long maxof3 (long a, long b, long c) {
    long x = a > b ? a : b,
         y = a > c ? a : c;
    return x > y ? x : y;
}

long midof3 (long a, long b, long c) {
    long x = minof3 (a, b, c),
         z = maxof3 (a, b, c),
         y = a == x ? b : a;
    return y == z ? c : y;
}

int main (int argc, char **argv) {

    long x = argc > 1 ? strtol (argv[1], NULL, 10) : 99,
         y = argc > 2 ? strtol (argv[2], NULL, 10) : 231,
         z = argc > 3 ? strtol (argv[3], NULL, 10) : 8;

    printf ("\n sorted values : %ld, %ld, %ld\n",
            minof3 (x, y, z), midof3 (x, y, z), maxof3 (x, y, z));

    return 0;
}

Пример использования/вывода

$ ./bin/sort3
 sorted values : 8, 99, 231

$ ./bin/sort3 -23 -281 1031
 sorted values : -281, -23, 1031

(да, я знаю, что это старый пост, но, учитывая недавний комментарий о коде, скрытый за функцией swap, приведен полный пример).

Ответ 7

Самый простой способ - сравнить и заменить swap.Order if, если условия важны.

if(a>b)
    swap(a,b);
if(a>c)
    swap(a,c);
if(b>c)
    swap(b,c);

Ответ 8

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

public static void Sort3Elements(int a, int b, int c)
    {
        if (a <= b && a <= c)               //a is lowest here
        {
            if (b<=c)                       //a <= b <= c
                Console.WriteLine("{0}-{1}-{2}", a, b, c);
            else                            //a <= c <= b
                Console.WriteLine("{0}-{1}-{2}", a, c, b);
        }
        else if (b<=a && b<=c)              //b is lowest here
        {
            if (a <= c)                     //b <= a <= c
                Console.WriteLine("{0}-{1}-{2}", b, a, c);
            else                            //b <= c <= a
                Console.WriteLine("{0}-{1}-{2}", b, c, a);
        }
        else                                //c is lowest
        {
            if (a <= b)                       //c <= a <= b
                Console.WriteLine("{0}-{1}-{2}", c, a, b);
            else                              //c <= b <= a
                Console.WriteLine("{0}-{1}-{2}", c, b, a);
        }
    }