1
+ #include <assert.h>
2
+ #include <limits.h>
1
3
#include <stdbool.h>
2
4
#include <stdio.h>
3
5
#include <stdlib.h>
4
6
#include <string.h>
7
+ #include <time.h>
5
8
6
9
#include "lib_test.h"
7
10
#include "lib_ll.h"
13
16
#define PASSED 0
14
17
#define FAILED 1
15
18
19
+ #define SORT_TESTS 1000
20
+
16
21
void exit_error (const char * err_msg )
17
22
{
18
23
fprintf (stderr , "ERROR: %s\n" , err_msg );
@@ -393,6 +398,168 @@ int test_vqueue()
393
398
return result ;
394
399
}
395
400
401
+ /* test outcome of sort algorithm - all data should be sorted */
402
+ int test_sort_data (int data [], int lo , int hi )
403
+ {
404
+ int i = lo , result = 0 ;
405
+ while (i < hi )
406
+ {
407
+ if (!(data [i ] <= data [i + 1 ])) result ++ ;
408
+ i ++ ;
409
+ }
410
+ return result ;
411
+ }
412
+
413
+ /* test specific position of data */
414
+ int test_sort_data_loc (int data [])
415
+ {
416
+ int i = 0 , result = 0 ;
417
+ while (i < 10 ) {
418
+ if (data [i ] != i ) result ++ ;
419
+ i ++ ;
420
+ }
421
+ return result ;
422
+ }
423
+
424
+ /* generate random number from min to max */
425
+ int random_int (int min , int max )
426
+ {
427
+ assert (min > INT_MIN );
428
+ assert (max < INT_MAX /2 );
429
+ assert (max >= min );
430
+ return rand () % max + min ;
431
+ }
432
+
433
+ /* use clock in system to create random seed for number generator */
434
+ void seed_rand ()
435
+ {
436
+ srand (time (0 ));
437
+ }
438
+
439
+ /* set pre-selected data in array */
440
+ void sort_set_array (int data [])
441
+ {
442
+ assert (data != NULL );
443
+ data [0 ] = 4 ;
444
+ data [1 ] = 5 ;
445
+ data [2 ] = 7 ;
446
+ data [3 ] = 9 ;
447
+ data [4 ] = 8 ;
448
+ data [5 ] = 1 ;
449
+ data [6 ] = 6 ;
450
+ data [7 ] = 0 ;
451
+ data [8 ] = 3 ;
452
+ data [9 ] = 2 ;
453
+ }
454
+
455
+ /* fill random length array with random data */
456
+ void sort_rnd_data_fill (int * data , int length , int min , int max )
457
+ {
458
+ int i = 0 ;
459
+ seed_rand ();
460
+ while (i < length ) {
461
+ data [i ]= random_int (min , max );
462
+ i ++ ;
463
+ }
464
+ }
465
+
466
+ int test_sort ()
467
+ {
468
+ int i , result = 0 , length , min_data_val , max_data_val ;
469
+ int * temp_data ;
470
+ int data [10 ];
471
+
472
+ test_msg_start ("Test Selection Sort - Preset Array" );
473
+ sort_set_array (data );
474
+ sort_selection (data , 0 , 9 );
475
+ result += test_sort_data (data , 0 , 9 );
476
+ result += test_sort_data_loc (data );
477
+ test_msg_end (result );
478
+
479
+ test_msg_start ("Test Selection Sort - Random Data" );
480
+ for (i = 0 ; i < SORT_TESTS ; i ++ ) {
481
+ seed_rand ();
482
+ min_data_val = random_int (INT_MIN + 1 , (INT_MAX /2 )- 1 );
483
+ max_data_val = random_int (min_data_val , (INT_MAX /2 )- 1 );
484
+ length = random_int (1 , 1000 ); /* get length of a new array */
485
+ temp_data = malloc (sizeof (int ) * length );
486
+ sort_rnd_data_fill (temp_data , length , min_data_val , max_data_val );
487
+ sort_selection (temp_data , 0 , length );
488
+ result += test_sort_data (temp_data , 0 , length );
489
+ free (temp_data );
490
+ temp_data = NULL ;
491
+ }
492
+ test_msg_end (result );
493
+
494
+ test_msg_start ("Test Insertion Sort - Preset Array" );
495
+ sort_set_array (data );
496
+ sort_insertion (data , 0 , 9 );
497
+ result += test_sort_data (data , 0 , 9 );
498
+ result += test_sort_data_loc (data );
499
+ test_msg_end (result );
500
+
501
+ test_msg_start ("Test Insertion Sort - Random Data" );
502
+ for (i = 0 ; i < SORT_TESTS ; i ++ ) {
503
+ seed_rand ();
504
+ min_data_val = random_int (INT_MIN + 1 , (INT_MAX /2 )- 1 );
505
+ max_data_val = random_int (min_data_val , (INT_MAX /2 )- 1 );
506
+ length = random_int (1 , 1000 ); /* get length of a new array */
507
+ temp_data = malloc (sizeof (int ) * length );
508
+ sort_rnd_data_fill (temp_data , length , min_data_val , max_data_val );
509
+ sort_insertion (temp_data , 0 , length );
510
+ result += test_sort_data (temp_data , 0 , length );
511
+ free (temp_data );
512
+ temp_data = NULL ;
513
+ }
514
+ test_msg_end (result );
515
+
516
+ test_msg_start ("Test Quick Sort (Recursive) - Preset Array" );
517
+ sort_set_array (data );
518
+ sort_quick (data , 0 , 9 );
519
+ result += test_sort_data (data , 0 , 9 );
520
+ result += test_sort_data_loc (data );
521
+ test_msg_end (result );
522
+
523
+ test_msg_start ("Test Quick Sort (Recursive) - Random Data" );
524
+ for (i = 0 ; i < SORT_TESTS ; i ++ ) {
525
+ seed_rand ();
526
+ min_data_val = random_int (INT_MIN + 1 , (INT_MAX /2 )- 1 );
527
+ max_data_val = random_int (min_data_val , (INT_MAX /2 )- 1 );
528
+ length = random_int (1 , 1000 ); /* get length of a new array */
529
+ temp_data = malloc (sizeof (int ) * length );
530
+ sort_rnd_data_fill (temp_data , length , min_data_val , max_data_val );
531
+ sort_quick (temp_data , 0 , length );
532
+ result += test_sort_data (temp_data , 0 , length );
533
+ free (temp_data );
534
+ temp_data = NULL ;
535
+ }
536
+ test_msg_end (result );
537
+
538
+ test_msg_start ("Test Quick Sort - Preset Array" );
539
+ sort_set_array (data );
540
+ sort_quick_norecurse (data , 0 , 9 );
541
+ result += test_sort_data (data , 0 , 9 );
542
+ result += test_sort_data_loc (data );
543
+ test_msg_end (result );
544
+
545
+ test_msg_start ("Test Quick Sort - Random Data" );
546
+ for (i = 0 ; i < SORT_TESTS ; i ++ ) {
547
+ seed_rand ();
548
+ min_data_val = random_int (INT_MIN + 1 , (INT_MAX /2 )- 1 );
549
+ max_data_val = random_int (min_data_val , (INT_MAX /2 )- 1 );
550
+ length = random_int (1 , 1000 ); /* get length of a new array */
551
+ temp_data = malloc (sizeof (int ) * length );
552
+ sort_rnd_data_fill (temp_data , length , min_data_val , max_data_val );
553
+ sort_quick_norecurse (temp_data , 0 , length );
554
+ result += test_sort_data (temp_data , 0 , length );
555
+ free (temp_data );
556
+ temp_data = NULL ;
557
+ }
558
+ test_msg_end (result );
559
+
560
+ return result ;
561
+ }
562
+
396
563
int test_stack_array ()
397
564
{
398
565
int result = 0 ;
@@ -407,6 +574,7 @@ int test_all()
407
574
result += test_stack_array ();
408
575
result += test_vstack ();
409
576
result += test_vqueue ();
577
+ result += test_sort ();
410
578
return result ;
411
579
}
412
580
0 commit comments