лучший алгоритм для свопинга?

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

5
задан Ashish Yadav 13 March 2010 в 05:39
поделиться

5 ответов

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

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

используйте tmp = a; а = б; b = tmp;

10
ответ дан 18 December 2019 в 07:29
поделиться

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

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

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

3
ответ дан 18 December 2019 в 07:29
поделиться

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

    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) ;
-2
ответ дан 18 December 2019 в 07:29
поделиться

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

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

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

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

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

10
ответ дан 18 December 2019 в 07:29
поделиться

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

0
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

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