我想知道下面的基數排序程序的邏輯。基數排序工作
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
typedef unsigned uint;
#define swap(a, b) { tmp = a; a = b; b = tmp; }
#define each(i, x) for (i = 0; i < x; i++)
/* sort unsigned ints */
static void rad_sort_u(uint *from, uint *to, uint bit)
{
if (!bit || to < from + 1) return;
uint *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;
uint *x = (uint*) a;
each(i, len) x[i] ^= INT_MIN;
rad_sort_u(x, x + len, INT_MIN);
each(i, len) x[i] ^= INT_MIN;
}
static inline void radix_sort_unsigned(uint *a, const size_t len)
{
rad_sort_u(a, a + len, (uint)INT_MIN);
}
int main(void)
{
int len = 16, x[16], i;
size_t len = 16, i;
each(i, len) x[i] = rand() % 512 - 256;
radix_sort(x, len);
each(i, len) printf("%d%c", x[i], i + 1 < len ? ' ' : '\n');
return 0;
}
我堅持,因爲我不太明白的,而(1)循環..
到目前爲止,我已經知道的是:
INT_MIN=-2147483648
這是相同的價值在rad_short_u()
我已經調試的程序,由於rand() % 512-256
bit
,一些-ve值也產生,
第一次通過時,它將所有的-ve值交換到一側(從開始)和+ ve之後 從下一個通道它左移到1位,所以位值從1073741824變爲1073741824,直到它變爲1數組保持不變。
請幫我理解程序邏輯。
現在,謝謝你,我明白了算法,進一步我還發現它在書中由robert sedgewick作爲基數交換排序給出。 – MKS