기수 교환 정렬

nayana의 이미지

#include <stdio.h>

#define N 100

unsigned bits( unsigned x, int k, int j );
void radix_exchange_sort( int a[], int n, int b );

int main ( void )
{
    int i, n, score[N];
    printf("Number of data?\t");
    scanf("%d", &n);
    
    for ( i = 0; i < n; i++ )
	  {
 	      printf("score[%d] = ", i );
	      scanf("%d", &score[i]);
	  }

    radix_exchange_sort( score, n, 31 );

    for ( i = 0; i < n; i++ )
	      printf("(%d)\t %d\n", i + 1, score[i]);

    return 0;
}

unsigned bits( unsigned x, int k, int j )
{
    return ( x >> k ) & ~( ~0 << j );
}

void radix_exchange_sort( int a[], int n, int b )
{
    int t, i, j;
    if ( n > 1 && b >= 0 )
    {
	      i = 0;
	      j = n - 1;
	      while( 1 )
		  {
		      while ( ( bits( a[i], b, 1 )  == 0 ) && ( i < j ) ) 
			  {
			      i++;
			  }
		      
		      while ( ( bits( a[j], b, 1 ) == 0 ) && ( i < j ) ) 
			  {
			      j--;
			  }
		      
		      if( i >= j ) break;
		      t = a[i];
		      a[i] = a[j];
		      a[j] = t;
		  }
    }
    
    if ( bits( a[n - 1], b, 1 ) == 0 ) j++;
    radix_exchange_sort( a, j, b - 1 );
    radix_exchange_sort( a + j, n - j, b - 1 );
}	    

나름대로 기수 교환 알고리즘을 짜봤는데...락이 걸려버립니다.
어디서 락이 걸리는지는 알겠는데...정렬을 어떻게 시켜할지 의문입니다.