Быстрая сортировка массива сортировки [дубликат]

23
задан Michael Borgwardt 11 January 2010 в 13:01
поделиться

10 ответов

Это не имеет никакого отношения к неизменности целых чисел; это связано с тем, что Java является Pass-by-Value, Dammit! (Не раздражает, просто заголовок статьи: p)

Подводя итог: вы действительно не можете сделать swap-метод в Java. Вам просто нужно сделать своп самостоятельно, где бы вы ни нуждались; это всего лишь три строки кода в любом случае, поэтому не должно быть такой большой проблемы:)

    Thing tmp = a;
    a = b;
    b = tmp;
45
ответ дан Svish 28 August 2018 в 17:11
поделиться
  • 1
    Почему при голосовании? Я что-то неправильно понял? – Svish 11 January 2010 в 12:58
  • 2
    Но если Integer был изменен и имел, например, поле setValue, замена значений путем вызова setValue была бы видимым изменением. Таким образом, он имеет какое-то отношение к изменчивости в том, что вы все еще можете использовать метод void, который достиг результата, который хочет получить автор. – Robert Christie 11 January 2010 в 13:01
  • 3
    Но вы бы не поменяли местами целые числа, которые, кажется, являются целью. Если у меня есть автостоянка с двумя автомобилями, а затем первый автомобиль выглядит точно так же, как второй автомобиль, а второй автомобиль точно так же, как первый автомобиль, я бы поменял автомобили? На самом деле, нет. Я бы просто сделал много работы, чтобы он казался таким. – Svish 11 January 2010 в 13:06
  • 4
    Иногда требуются инкапсулированные методы подкачки - очевидно, не в этом случае. Использование массивов для возврата нескольких значений является общей схемой для этого типа проблем. – Robert Christie 11 January 2010 в 13:14
  • 5
    Нет, причина, по которой вы не можете обменять на Java, состоит в том, что у вас есть указатели no . Указатели - это то, что позволяет использовать метод swap в c ++. Вы можете сортировать значения двух полей объекта, но вы не можете иметь общую функцию свопинга. И даже тогда, это просто делает то, что сказано в примере автомобилей выше. – Mitchell Carroll 6 May 2015 в 20:50

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

public class Main {

    static void swap (Integer[] values) {
        if ((values == null) || (values.length != 2)) {
          throw new IllegalArgumentException("Requires an array with exact two values");
        }

        Integer t = values[0];
        values[0] = values[1];
        values[1] = t;
    }

    public static void main(String[] args) {
       Integer a = 1;
       Integer b = 2;
       Integer[] integers= new Integer[]{a,b};
       swap(integers);
       System.out.println("a=" + integers[0] + " b=" + integers[1]);
    } 
}

(просто добавил этот ответ, потому что Svish упомянул, что «Вы действительно не можете создать метод swap в Java» фг )

2
ответ дан Andreas_D 28 August 2018 в 17:11
поделиться

Код Java:

class swap {

    int n1;
    int n2;
    int n3;

    void valueSwap() {
        n3 = n1;
        n1 = n2;
        n2 = n3;
    }

    public static void main(String[] arguments) {

        Swap trial = new Swap();
        trial.n1 = 2;
        trial.n2 = 3;

        System.out.println("trial.n1 = " + trial.n1);
        System.out.println("trial.n2 = " + trial.n2);

        trial.valueSwap();

        System.out.println("trial.n1 = " + trial.n1);
        System.out.println("trial.n2 = " + trial.n2);

    }
}

Выход:

trial.n1 = 2
trial.n2 = 3
trial.n1 = 3
trial.n2 = 2
0
ответ дан Daniel Vaughn 28 August 2018 в 17:11
поделиться

Вам нужно будет передать параметры по ссылке, что невозможно в java. Также целые числа являются inmutables, поэтому вы не можете обменивать значения, поскольку у вас нет метода setValue.

1
ответ дан ggf31416 28 August 2018 в 17:11
поделиться

Использование XOR-оператора - очень плохая идея:

Во-первых, это гораздо менее читаемо. Во-вторых, были времена, когда это было быстрее, но в настоящее время наоборот. См.

Wikipedia

для справки.

0
ответ дан helpermethod 28 August 2018 в 17:11
поделиться
  • 1
    FYI, потому что SO перетасовывает ответы, когда они поднимаются / опускаются, как правило, рекомендуется использовать «добавить комментарий». ссылку, чтобы добавить комментарий к ответу, на который вы ссылаетесь, вместо того, чтобы писать комментарий в новом ответе. Легче понять, что вы комментируете. – Fredrik 12 January 2010 в 14:37

Как все ребята упоминали о своей вещи «Постепенное значение».

Просто понравилось: вы можете использовать этот метод замены GLOBAL-целых чисел.

private void swap (){
     a ^= b;
     b ^= a;
     a ^= b;
}

It исключает использование другой переменной, а ее просто кулер:)

0
ответ дан medopal 28 August 2018 в 17:11
поделиться
  • 1
    Это может быть классно, но это не очень читаемо. – mR_fr0g 11 January 2010 в 14:12
  • 2
    Прохладная версия swap - без лишней переменной, сложная и хорошая для того, чтобы спросить студентов, как это сделать ;-), но ... она не работает на Java :-( Или это? – WildWezyr 11 January 2010 в 14:15
  • 3
    @WildWezyr как нет? будьте осторожны, чтобы a и b были глобальными здесь, иначе вам нужно будет использовать методы, упомянутые ребятами выше – medopal 11 January 2010 в 14:17
  • 4
    a ^ = b совпадает с a = a ^ b. Это влияет на присвоение значения выражения (a ^ b) локальной переменной a. Другие два назначения также влияют только на локальные переменные (внутри метода свопинга), поэтому этот классный трюк не работает. – witzar 11 January 2010 в 14:20
  • 5
    @medopal: Если я печатаю переменные a & amp; b после выполнения метода private void swap (Integer a, Integer b) {...}, они все еще остаются без изменений (без изменений в качестве побочного эффекта вашего метода свопинга). Предоставленный оператор a ^ = b является просто сокращением a = a ^ b, поэтому это просто назначение переменной, которое не работает в Java для метода swap. – WildWezyr 11 January 2010 в 14:27

Все в Java передается по значению, а значения переменных всегда являются примитивами или ссылками на объект.

9
ответ дан Ravi Gupta 28 August 2018 в 17:11
поделиться

Целое значение неизменное - вы не можете изменить свои значения. Перемещение, которое происходит внутри функции свопинга, относится к ссылкам, а не значениям.

Вам нужно будет вернуть обе ссылки в массиве для достижения желаемого

static Integer[] swap(Integer a, Integer b) {
   return new Integer[]{b, a};
}

public static void main(String[] args) {
   Integer a = 1;
   Integer b = 2;

   Integer[] intArray = swap(a, b);

   a = intArray[0];
   b = intArray[1];

   System.out.println("a=" + a + " b=" + b);
} 

Если Integer имел метод setValue, вы могли бы сделать что-то вроде этого.

static void swap(Integer a, Integer b) {
   int temp = a.intValue();
   a.setValue(b.intValue());
   b.setValue(temp);
}

Но это не так, чтобы достичь того, чего вы хотите, верните массив.

0
ответ дан Robert Christie 28 August 2018 в 17:11
поделиться
  • 1
    Целочисленная неизменность здесь не проблема. – Svish 11 January 2010 в 12:53

Использование сканера:

import java.util.*;
public class Swap {
 public static void main(String[] args){
  int i,temp,Num1,Num2;
  Scanner sc=new Scanner(System.in);
  System.out.println("Enter Number1 and Number2");
  Num1=sc.nextInt();
  Num2=sc.nextInt();
  System.out.println("Before Swapping Num1="+Num1+" Num2="+Num2);
  temp=Num1;
  Num1=Num2;
  Num2=temp;
  System.out.println("After Swapping Num1="+Num1+" Num2="+Num2);
 }    
}
0
ответ дан Siddhesh Urkude 28 August 2018 в 17:11
поделиться

Как сказал Svish и другие, это вызов по значению, а не по ссылке на Java. Поскольку у вас нет указателей на Java, вам нужен какой-то объект-держатель, чтобы действительно менять значения таким образом. Например:

static void swap(AtomicReference<Integer> a, AtomicReference<Integer> b) {

    Integer c = a.get();
    a.set(b.get());
    b.set(c);

}

public static void main(String[] args) {

    AtomicReference<Integer> a = new AtomicReference<Integer>(1);
    AtomicReference<Integer> b = new AtomicReference<Integer>(2);

    System.out.println("a = " + a);
    System.out.println("b = " + b);

    swap(a, b);

    System.out.println("a = " + a);
    System.out.println("b = " + b);

}
3
ответ дан yawn 28 August 2018 в 17:11
поделиться
  • 1
    Постскриптум Использование AtomicReference, вероятно, не имеет большого смысла для вас, поскольку это идиома параллельности. Создайте свой собственный держатель, если вам не нужны поточно-безопасные действия. – yawn 11 January 2010 в 13:01
  • 2
    «у вас нет указателей на Java». Я предполагаю, что у Java есть концепция указателей, но она не в распоряжении программистов. – Ravi Gupta 11 January 2010 в 13:22
  • 3
    Насколько я знаю, у вас есть указатели на Java. Они просто называются ссылками, и вы не можете манипулировать ими, как можете, на разных других языках в разной степени. – Svish 11 January 2010 в 13:30
  • 4
    Все, что у вас есть на Java, - это указатели. Если у вас есть ссылки (например, на эти указатели), вы можете изменить значения, содержащиеся в этих указателях – Ghita 15 November 2012 в 22:59
Другие вопросы по тегам:

Похожие вопросы: