2013-03-23 3 views
0

Я новичок в Ruby, и совершенно запутался о методе сортировкиArray sort {| x, y | }, х всегда меньше?

Например:

person.sort{|x, y| x.age<=> y.age} 

Я знаю, что если я изменю его y.age<=> x.age, она будет полностью изменить порядок сортировки.

Я прочитал эту other question и все они только говорят, что x и y два элемента из массива, выбранный алгоритмом sort.

Но есть x всегда меньший объект? Я имею в виду, если я напишу его, как первый, всегда ли он будет от младшего до самого старого?

Благодаря

+0

Ха-ха, эти ответы хороши, но ни один из них не указывает, является ли «х» меньшим или большим. – hrsetyono

+2

Но я не понимаю, почему принятый ответ в дубликате также не отвечает на этот вопрос. Вы знакомы с оператором '<=>'? – JJJ

+0

Из того, что я прочитал в этом вопросе, он возвращает '-1', если' x hrsetyono

ответ

2

Это упрощение происходящего и не алгоритм сортировки Ruby использует (надеюсь), но может помочь понять, что происходит.

Допустим, у вас есть этот массив возрастов, которые вы хотите отсортировать:

[15, 25, 12] 

Теперь алгоритм сортировки начинает идти через массив, чтобы определить правильный порядок. Сначала он выбирает первые два элемента и сравнивает их:

|15, 25| 15 <=> 25 

В результате -1, так что теперь он знает, что 15 должны быть отсортированы, прежде чем 25.

Далее он принимает 25 и 12.

|25, 12| 25 <=> 12 

Результат: 1. 12 должны быть отсортированы до 25.

Теперь мы знаем, что 25 следует сортировать после каждого другого элемента.Нам нужно только знать порядок между 15 и 12.

|15, 12| 15 <=> 12 

В результате 1, поэтому 12 должны быть отсортированы, прежде чем 15. Теперь окончательное упорядочение известно:

[12, 15, 25] 

Как вы видите, алгоритм сравнения называется несколько раз. x и y в |x, y| являются заполнителями для элементов массива, которые передаются методу сравнения.

+0

Большое спасибо за это. Я никогда не думал, что это происходит несколько раз – hrsetyono

2

Вот как вы можете ответить на этот вопрос самостоятельно, с формой reductio ad absurdum: Что делать, если xбыли всегда меньший объект? Если бы это было так, то вам не нужно было бы сравнивать его с y, не так ли? Вы могли бы просто написать это:

person.sort { |x, y| 1 } 

Или, может быть, у меня есть, что в обратном направлении, и вы могли бы просто написать это:

person.sort { |x, y| -1 } 

Но так или иначе, это своего рода абсурд, не правда ли? Конечно, если вы попробуете, это не сработает.

Итак, это говорит нам, что в теле этого блока сортировки мы не знаем, является ли x или y меньшим объектом. Фактически, x и y могут быть любыми двумя произвольными элементами из массива person. Вот почему мы должны выписать сравнение.

Помогло ли это разъяснить это, или я неправильно понял ваш вопрос?

+0

Да, вы понимаете вопрос. Итак, когда мы пишем 'x.age <=> y.age', мы не знаем, отсортировано ли оно от младшего к старшему или от самого старого до самого молодого? – hrsetyono

+1

Нет. В этом случае он сортируется от yongest-to-oldest, потому что если 'x.age' является, скажем, 12 и' y.age' равным 15, он определит, что 12 должно быть отсортировано до 15. – JJJ

+0

Но когда мы запускаем это, мы не знаем, будет ли 'x' меньше 15? Это может быть 25, которые будут упорядочивать массив от самого старого до самого молодого. – hrsetyono