기수 정렬 알고리즘을 연구했지만 원본 소스 코드 중 일부를 이해할 수 없었습니다. 그것의 for (i = 0; i < len; i++) x[i] ^= INT_MIN;
기수 정렬. 왜 Xor인가?
내가 그 XOR을 알고이 줄을 사용하는 이유
static void rad_sort_u(unsigned *from, unsigned *to, unsigned bit)
{
if (!bit || to < from + 1) return;
unsigned *ll = from, *rr = to - 1,tmp;
while (1) {
/* find left most with bit, and right most without bit, swap */
while (ll < rr && !(*ll & bit)) ll++;
while (ll < rr && (*rr & bit)) rr--;
if (ll >= rr) break;
swap(*ll, *rr);
}
if (!(bit & *ll) && ll < to) ll++;
bit >>= 1;
rad_sort_u(from, ll, bit);
rad_sort_u(ll, to, bit);
}
/* sort signed ints: flip highest bit, sort as unsigned, flip back */
static void radix_sort(int *a, const size_t len)
{
size_t i;
unsigned *x = (unsigned*) a;
for (i = 0; i < len; i++)
x[i] ^= INT_MIN;
rad_sort_u(x, x + len, INT_MIN);
for (i = 0; i < len; i++)
x[i] ^= INT_MIN;
}
는 모르겠지만 나는이 상황에서이 연산자의 사용을 이해하지 않습니다.
힌트 : 'INT_MIN'은 아마도 '0x80000000'입니다. – Mysticial
소스에서 주석을 읽으십시오. 또는 정렬 전에 'unsigned'로 숫자에'2^(width-1) '을 더할 수 있고, 정렬 후에 다시 빼기를 할 수 있습니다. –
이 코드는 재귀에서 잘못된 정렬의 * 스택 오버플로 *가 있습니다. 이 알고리즘을 올바르게 구현하려면 먼저 더 작은 절반으로 다시 들어간 다음 큰 절반에 대해 꼬리 재귀 (또는 단지 '위로 가기')를 수행해야합니다. –