私は基数ソートアルゴリズムを研究していましたが、元のソースコードの一部を理解できませんでした。そのは for (i = 0; i < len; i++) x[i] ^= INT_MIN;
基数ソート。なぜ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
ソースでコメントを読むと、その説明があります。あるいは、ソートの前に '2 ^(width-1)'を 'unsigned'として数値に加え、ソート後に再び減算することもできます。 –
それは価値があるため、このコードはその再帰の悪いソートの*スタックオーバーフロー*を持っています。このアルゴリズムを正しく実装するには、最初に小さい方の半分に再帰し、大きな半分をテール再帰(または単に 'goto top;')しなければなりません。 –