C50 Answer


#include <stdio.h>
#include <stdlib.h>

/* Puzzle C50 -- randomly scramble an array until it is sorted
|
*/
int randInt( int min, int max );
void scrambleArray( int arr[], int size );

void reallyBadSort( int arr[], int size )
{
  while ( inOrder( arr, size ) > 0 )
    scrambleArray( arr, size );
}

int inOrder( int arr[], int size )
{
  int j, count=0 ;

  for ( j=0; j<size-1; j++ )
  {
    if ( arr[j] > arr[j+1] ) count++ ;
  }

  return count;
}

void scrambleArray( int arr[], int size )
{
  int j, twin; /* element j and its twin are swapped */
  int twinVal;

  for ( j=0; j<size-1; j++ )
  {
    /* for each element j, pick a random twin and swap */
    twin = randInt(j,size-1);
    twinVal = arr[twin];
    arr[twin] = arr[j];
    arr[j] = twinVal;
  }
}

void printArray( int arr[], int size )
{
  const int N = 10;
  int j;
  
  for ( j=0; j<size; j++ )
  {
    if ( j%N == N-1 )
      printf("%4d\n", arr[j] );
    else
      printf("%4d ", arr[j] );    
  }
}

int randInt( int min, int max )
{
  return (rand()*(max-min+1))/(RAND_MAX+1) + min ;
}

void fillArrayRandom( int arr[], int size, int low, int high )
{
  int j;
  for ( j=0; j<size; j++ )
    arr[j] = randInt( low, high );
}

int main(int argc, char *argv[])
{
  const int SIZE = 20 ;
  int x[SIZE] ;
  int num;
  long start, end;
  
  srand( time(0) );
  fillArrayRandom( x, SIZE, 0, 100 );
  printArray( x, SIZE );
  printf("\n\n");

  printf( "start: %ld\n", start=time(0) );
  
  reallyBadSort( x, SIZE );
  
  printf( "end  : %ld\n", end=time(0) );
  printf( "elapsed time: %ld seconds\n\n", end-start );
  printArray( x, SIZE );

  printf("\n\n");
  system("PAUSE");	
  return 0;
}