-1

В три переменные a, b и c явно записаны программистом три целых попарно неравных между собой числа. Создать программу, которая переставит числа в переменных таким образом, чтобы при выводе на экран последовательность a, b и c оказалась строго возрастающей.

Пример ввода:
a = 14;
b = 10;
c = 23;

Результат:
a = 10;
b = 14;
c = 23;

Я сделал вот так

public static void main(String args []){
    int a = in.nextInt();
    int b = in.nextInt();
    int c = in.nextInt();
    int x;
    System.out.println("Числа в переменных a, b и c : " + a  + " " + b + " " + c);
   if (a > b) {
      x = a; a = b; b = x;
     }
   if (b > c){
      x = b; b = c; c = x;
     }
  System.out.println("Возрастающая последовательность: " + a  + " " + b + " " + c);
}
Kromster
  • 13,809
Rubik
  • 63
  • Что вы пробовали и что у вас не получилось? – Алексей Шиманский Oct 01 '16 at 17:49
  • Спасибо,сейчас. – Rubik Oct 01 '16 at 17:55
  • 1
    Дополните вопрос кодом. Какие сложности возникли при решении задачи? – 0xdb Oct 01 '16 at 18:00
  • Короче правильно нужно ещё раз a и b сравнить скопирован первый if. – pavel Oct 01 '16 at 21:36
  • А не проще сразу выводить в таком виде: Минимальное - мин(а, мин(б, в)). Среднее - (а + б + в - макс(а, макс(б, в)) - мин(а, мин(б, в)). Самое большое - макс(а, макс(б, в))? – entithat Jan 11 '18 at 20:38
  • Извините, но ваш код: public static void main(String args []){ int a = in.nextInt(); int b = in.nextInt(); int c = in.nextInt(); int x; System.out.println("Числа в переменных a, b и c : " + a + " " + b + " " + c); if (a > b) { x = a; a = b; b = x; } if (b > c){ x = b; b = c; c = x; } System.out.println("Возрастающая последовательность: " + a + " " + b + " " + c); } Работает НЕ верно, если С<B. По крайней мере, у меня... :( – Александр Jan 16 '22 at 13:58

5 Answers5

4

Вот такое незамысловатое решение:

import java.util.Arrays;

public class Sort
{
    public static void main(String[] args)
    {
        int[] array = new int[]{21,9,11};
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
    }
}

Вывод:

[9, 11, 21]

Если смысл вопроса сводится, как самому реализовать алгоритм, то смотрим например тут.

0xdb
  • 51,614
  • для фиксированного числа элементов, можно специализированные алгоритмы сортировки использовать (если есть специализированные требования, например, как в теле вопроса или для скорости) – jfs Oct 02 '16 at 16:51
  • @jfs Да, я знаю. И хотя и подозреваю, что это контрольное задание или что-то подобное и ожидается пара написаных циклов, но в вопросе не увидел каких-то специалных требований. Пускай автор сам попробует решить задачу. – 0xdb Oct 02 '16 at 17:10
  • под "специализированные требования" в теле вопросе я имел ввиду что ввод и вывод заданы в трёх отдельных переменных, а не в одном массиве, если следовать букве. – jfs Oct 02 '16 at 19:02
3

Доказано (для сетей сортировки), что три сравнения—это оптимальное число, но ваш код в вопросе использует только два сравнения (ошибка). Добавьте третье сравнение, например:

public class Sort3
{
  public static void main(String[] args)
  {
    int a = 14;
    int b = 10;
    int c = 23;
    assert a != b && a != c && b != c;
    System.out.println("Числа в переменных a, b и c : " + a  + " " + b + " " + c);
    if (b > c) {
      int x = b; b = c; c = x; // swap(b, c);
    }
    assert b < c;
    if (a > c) {
      int x = a; a = c; c = x; // swap(a, c);
    }
    assert a < c;
    if (a > b) {
      int x = a; a = b; b = x; // swap(a, b);
    }
    assert a < b && b < c;
    System.out.println("Возрастающая последовательность: " + a  + " " + b + " " + c);
  }
}

Пример:

$ javac -g Sort3.java
$ java -ea Sort3
Числа в переменных a, b и c : 14 10 23
Возрастающая последовательность: 10 14 23

В большинстве случаев , следует Arrays.sort(array) стандартную функцию использовать, как показано в ответе @0xdb, так как версия, созданная руками, может содержать ошибки (как ваш пример показал), может быть менее понятна (не очевидно намерение, по сравнению с Arrays.sort(array)) и даже может быть медленнее (всегда измеряйте, если производительность важна).

jfs
  • 52,361
1

Алгоритм таков: в начале тебе надо создать переменную (min) и записать туда одно из твоих чисел. Затем в цикле сравнить ее с каждой последующей. Если какая-то оказалась меньше, то ты меняй значение min на ту, которая при сравнении была меньше. И так в конце цикла в min у тебя будет та переменная, ниже которой ты не нашел. Далее повтори это для максимального числа. Третье число будет средним.

Вот набросок кода:

int[] array = {a, b, c};
var min = array[0];
for (var i; i < 3; i++)
{
  if (min > array[i]) 
     min = array[i]
}
Kromster
  • 13,809
Nikolay
  • 824
  • не понимаю людей, которые минусуют. Это же основа алгоритмизации – Nikolay Oct 01 '16 at 18:04
  • 1
    Видимо за работу за автора, т.к. сподвигаете человека просто приходить за копипастом без собственных усилий в решении. – Алексей Шиманский Oct 01 '16 at 18:06
  • был вопрос, я дал ответ, не понимаю проблемы. Тут нет готового кода. Его явно надо подстраивать, тут только нахождение минимального и все. И если бы тут был голый код без объяснения, то то может еще один повод для минуса, но объяснение-то есть. Полное и с примером. Думаю кто-то просто не успел ответить и решил наставить минусов:\ – Nikolay Oct 01 '16 at 18:09
  • Количество ответов тут не ограничено, вообще-то)) Более того, даже одним участником можно много ответов написать) – Алексей Шиманский Oct 01 '16 at 18:15
  • я имел ввиду первый дал ответ. Тогда моя логика сломана – Nikolay Oct 01 '16 at 18:17
  • Лови +1 за пояснение алгоритма! – Kromster Oct 01 '16 at 18:20
  • Я вообше то с основамми алгоритмизации не свсем знаком, но что-то не вижу в ответе решения задачи. – 0xdb Oct 01 '16 at 18:29
  • Давно кстати в Java "var" появились? и цикл начинается с неизвестности?) – Алексей Шиманский Oct 01 '16 at 18:31
  • немного импровизации, извиняюсь) сам пишу не на java, но ответ по этому вопросу дать могу. – Nikolay Oct 01 '16 at 18:34
  • @0xdb если цикл немного улучшить, то можно получить список по возрастанию. Допустим, найденное минимальное значение убирать из массива и повторять цикл. Так мы получим элементы по возрастанию. Я полагаю, что с перестановкой значений между двумя переменными автор знаком. Если нет, пусть задаст вопрос – Nikolay Oct 01 '16 at 18:36
  • @АлексейШиманский человек, который поставил минус за "работу за автора", не прав. Можете ему ссылку дать, чтобы прояснить как сайт работает: Работа за автора. Кроме того, подобные вопросы могут быть интересными: Fastest sort of fixed length 6 int array – jfs Oct 02 '16 at 16:46
  • @jfs каждый распоряжается голосами на свое усмотрение. Кто-то посчитал, что давать код (может и не весь) на вопрос, без попыток автора - неправильным. Поставил минус. Я лично солидарен с такими людьми. Ибо в итоге получается копипастящее растение, а не homosapiens – Алексей Шиманский Oct 02 '16 at 16:58
  • @АлексейШиманский неверно, вы не можете голосовать как вам вздумается (поэтому например серия минусов, автоматически может быть отменена и sock puppets будут забанены). Зачем вы посещаете сайт, с целями которого вы не согласны? (цель не в том, чтобы автору ответ дать (этот сайт—не help desk). Цель, чтобы всем кто имеет тот же вопрос, ответ дать—прочтите ссылку, которую я дал) Если не нравятся текущие соглашения, то пишите на Мету, не нужно в комментариях подобные обсуждения устраивать. – jfs Oct 02 '16 at 17:20
  • @jfs голосую именно так, как считаю правильным. Это саморегулирующееся сообщество и право на минус имею, даже просто так. Не согласен не целями ресурса, а с бестолочами и кармоферерами, им потыкающие. Вы можете хоть сто ссылок дать.)) Вы можете способствовать увеличению шлака и треша на ресурсе и количество безмозглых копипастеров. Ваша воля. В итоге, т.к. саморегулируемое сообщество, то если оно не согласно со мной - то выразит это плюсами на ответе. Спасибо за внимание. Я хоть и не всё сказал, но смысла в комментах разводить этот балаган и правда нет – Алексей Шиманский Oct 02 '16 at 17:26
  • @jfs кстати обратите внимание на то, на сколько подробным был вопрос с привидением примеров в ссылке, что вы дали на enSO и какое унылое невнятное шлачище было в самой первой версии данного вопроса, собственно на который и был дан самый первый ответ. почувствуй разницу. вот вы поощряете это г** – Алексей Шиманский Oct 02 '16 at 17:48
1

Если переменных всего 3, тогда:

public static void main(String args []){
    int a = in.nextInt();
    int b = in.nextInt();
    int c = in.nextInt();

    int min = Math.min(Math.min(a,b),c)
    int max = Math.max(Math.max(a,b),c)
    b = (a + b + c) - min - max; a = min; c = max;

    System.out.println("Возрастающая последовательность: " + a  + " " + b + " " + c);
}

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

sanix
  • 856
-1
public static void main(String[] args) {

    int a = in.nextInt();
     int b = in.nextInt();
      int c = in.nextInt();
      int x;

  if (a > b) {
     x = a; a = b; b = x;}
  else a = a;
    if (b > c){
       x = b; b = c; c = x;}
       else b=b;
       if (a > b) {
           x = a; a = b; b = x;}
       else c= c;

       System.out.println("Возрастающая последовательность:" + a + " " + b + " " + c);
    }

    }
Rubik
  • 63
  • А в чём код пишете? Какой то он волнообразный. – 0xdb Oct 01 '16 at 18:36
  • 1
    если добавить пару переменных, то такой код будет чутка громоздким и индусским. Не лучшая практика – Nikolay Oct 01 '16 at 18:38
  • я пишу на eclipse – Rubik Oct 01 '16 at 18:54
  • В еклипсе автоиндент есть, почему не пользуетесь. И вы добавили код в вопрос, т.ч. можете этот ответ удалить. – 0xdb Oct 01 '16 at 19:16