Более простой способ сортировки трех чисел - PullRequest
15 голосов
/ 06 декабря 2010

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

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

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

#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(); 
}    

Ответы [ 9 ]

19 голосов
/ 06 декабря 2010
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);

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

12 голосов
/ 06 декабря 2010

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

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

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

9 голосов
/ 07 декабря 2010
#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(); 
}    
5 голосов
/ 06 декабря 2010

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

2 голосов
/ 11 августа 2018

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

void sort(int a, int b, int c, int *min, int *mid, int *max) {
    min = a;
    mid = b;
    max = c;
    if (min > mid) { mid = a; min = b; }
    if (mid > max)
    {
        max = mid;
        mid = c;
        if (min > mid)
        {
            mid = min;
            min = c;
        }
    }
}

Это работает, потому что последний тест подкачки действительно нужен только в случае успеха второго тестав противном случае это будет просто повторение первого теста, который не будет выполнен по определению, поскольку мы уже отсортировали эти переменные).

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

2 голосов
/ 29 августа 2016

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

В случае min и max вы просто делаете 2 из 3 возможных сравнений, а затем возвращаете сравнение результатов.В случае mid , вы делаете то же самое, но вычисляете минимальное и максимальное значения 3, а затем сравниваете все 3 с min и max Чтобы найти значение, которое не является ни 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, приведен полный пример).

2 голосов
/ 06 декабря 2010

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

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

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

0 голосов
/ 27 августа 2018

Я пытался решить ту же проблему сегодня.Может сделать эту компактную версию кода без использования каких-либо временных переменных;петли;библиотечные функции, такие как swap, sort, max, min и т. д. Код использует только операторы if и создает непрерывные мутации в иерархии, пока не будут проверены все возможности.

0 голосов
/ 29 августа 2016

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

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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...