Как -1,0,1 помогают функции сортировки при имплицитном использовании в подпрограмме? - PullRequest
1 голос
/ 14 марта 2011

У меня возникли проблемы с подпрограммами, а именно с функцией sort , используемой для сортировки массива чисел. Я знаю, что если вы используете только функцию сортировки, она сортируется с использованием формата ASCII, поскольку книга описывает это и то, что сортирует не в нужном порядке. Я знаю и понимаю, что возвращается, используя <=> для сравнения значений, даже будучи введенным в cmp для строк (хотя я еще не использовал его).

Что я не понимаю конкретно, так это то, как они сортируют их численно - этот фактический процесс. Я понимаю, что возвращается, но книга просто говорит, что возвращает -1, 0 и 1, а не то, как конкретно числа в конечном итоге сортируются в 1 8 24 72 144 288.

Мой пример:

sub sort_by_number {
    return $a <=> $b;
}

@myArray = (1,24,8,144,72,288);

foreach(sort sort_by_number(@myArray)) {
    print("$_ ");
}

Пример, который я полностью понимаю. Это имеет смысл, но я думаю, что это в основном из-за кодировки:

#!/usr/bin/perl

print("Please enter your name: ");
$name = <STDIN>;
chomp($name);
print("Please enter your age: ");
$age = <STDIN>;
chomp($age);

print(greeting($name, $age));

sub greeting {
    $msg = "Hello $_[0], ";
    determine_age($_[1],$msg);
}

sub determine_age {
    $num = ($_[0] <=> 18);
    if ($num == -1) {
        return "$_[1]you are under 18.($_[0])\n";
    } elsif ($num == 0) {
        return "$_[1]you will be a 19 on your next birthday!\n";
    } else {
        return "$_[1]you are over 18!($_[0])\n";
    }
}

Огромная благодарность, если кто-то может прояснить.

Ответы [ 2 ]

9 голосов
/ 14 марта 2011

Ваш второй пример не выполняет никакой сортировки.

Чтобы ответить ", как он их численно сортирует - этот фактический процесс? ", В Perl внутренне реализована сортировка с использованием алгоритма Merge Sort (была быстрой сортировкой до Perl 5.6).

Сам алгоритм довольно сложен ( Подробнее см. Вики) , НО под ним заканчиваются сравнением двух чисел и решением, если одно больше другого, и выполнением некоторых действий в зависимости от этого решения. Если вам интересны детали, часть алгоритма, которая нуждается в сравнении, - это строка if first(left) ≤ first(right) в примере Wiki.

Вот тут и появляется функция пользовательской сортировки - она ​​отвечает на вопрос «какое число больше» для алгоритма сортировки (или, если быть более точным, одно число меньше или равно другому).

Как это реализовано, Perl sort будет внутренне вызывать функцию «компаратора» и передавать ей 2 аргумента (псевдонимами $a и $b); и ожидаем, что функция вернет отрицательное, нулевое или положительное значение, если первое меньше, равно или больше второго.

4 голосов
/ 14 марта 2011

<=> - числовой оператор. Когда вы сравниваете $a <=> $b, он возвращает -1, 0 или 1 в зависимости от того, числовой аргумент левого аргумента меньше, равен или больше правого аргумента.

Функция sort сравнивает элементы списка по парам, поэтому ей нужна функция сравнения, которая принимает два аргумента (двоичный оператор). Sort продолжает сравнивать пары и переупорядочивать их, пока каждый элемент не станет «больше», чем следующий элемент в списке.

...