лучший алгоритм для обмена? - PullRequest
5 голосов
/ 13 марта 2010

Я слышал от моего друга, что лучший алгоритм обмена "(a ^ = b ^ = a ^ = b)" где a и b - два целых числа, которые нужно поменять местами. но когда я применил это, используя язык с, это привело к сбою. может кто-нибудь из вас, прекрасные люди, объяснить возможную причину этого? Пожалуйста, предложите лучший алгоритм обмена. благодарю вас!!!! ребята, я хотел бы знать причину сбоя.

Ответы [ 5 ]

10 голосов
/ 13 марта 2010

a^=b^=a^=b;, вероятно, вылетает, потому что вызывает страшное неопределенное поведение . Нарушаемое им правило состоит в том, что он дважды модифицирует a без промежуточной точки последовательности. Это можно исправить, вставив несколько точек последовательности - например, с помощью оператора запятой:

a ^= (b ^= a ^= b, b);`

Или, разбив его на несколько операторов:

b ^= a ^= b; a ^= b;

Тем не менее, это обычно плохой метод обмена переменных - некоторые другие ответы и комментарии адекватно объяснили, почему.

9 голосов
/ 13 марта 2010

этот трюк подкачки иногда опасен, я видел неправильную программу быстрой сортировки, использующую этот своп, которая дает неверные результаты. Но обычный своп генерирует правильную программу.

Относительно скорости, компилятор иногда генерирует более быстрый код, если мы используем переменную tmp.

использовать tmp = a; a = b; b = tmp;

3 голосов
/ 13 марта 2010

См. http://en.wikipedia.org/wiki/Swap_(computer_science).

Использование временной переменной создает больше накладных расходов, но является более стабильным, чем алгоритм обмена XOR, а параллельные вычисления отдают его быстрее, чем обмен XOR.

См. Первый пример кода http://www.ibm.com/developerworks/linux/library/l-metaprog1.html для полной реализации использования временной переменной для замены.

0 голосов
/ 13 марта 2010

Напишите этот код, который быстрее читается человеком. И доверять способности компиляторов генерировать лучший код большую часть времени. Выполните профилирование, чтобы увидеть, является ли это единственным местом для улучшения скорости. Затем примените решения XOR, перечисленные много раз выше, они могут работать не везде.

0 голосов
/ 13 марта 2010

Используйте эту логику для числовых значений:

    int a = 10, b =5 ;
    a = a-b;
    b = b+a ;         // b gets the original value of a
    a = b - a;    // a gets the original value of b
    printf ("value : %d %d \n",a ,b) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...