@@ -21,53 +21,43 @@ void *safeMalloc (int n) {
21
21
return ptr ;
22
22
}
23
23
24
- int * copySubArray (int left , int right , int arr []) {
25
- int i , * copy = safeMalloc ((right - left )* sizeof (int ));
26
- for (i = left ; i < right ; i ++ ) {
24
+ int * copySubArray (int * arr , int left , int right ) {
25
+ /* copies the subarray arr[left..right] into a new array */
26
+ int * copy = safeMalloc ((right - left )* sizeof (int ));
27
+ for (int i = left ; i < right ; i ++ )
27
28
copy [i - left ] = arr [i ];
28
- }
29
29
return copy ;
30
30
}
31
31
32
- int mergeSort (int length , int arr []) {
33
- int l , r , mid , idx , * left , * right ;
34
- if (length <= 1 ) {
35
- return 0 ;
36
- }
37
- mid = length /2 ;
38
- left = copySubArray (0 , mid , arr );
39
- right = copySubArray (mid , length , arr );
40
- int count = mergeSort (mid , left );
41
- count += mergeSort (length - mid , right );
42
- idx = 0 ;
43
- l = 0 ;
44
- r = 0 ;
45
- while ((l < mid ) && (r < length - mid )) {
46
- if (left [l ] <= right [r ]) {
47
- // no inversions in this case
48
- arr [idx ] = left [l ];
49
- l ++ ;
50
- } else {
51
- // total number of inversions to add is the number of
52
- // elements currently left in the left array: mid - l
53
- arr [idx ] = right [r ];
54
- r ++ ; count += mid - l ;
32
+ int countInversions (int * arr , int length ) {
33
+ /* sorts an array of integers in O(n log n) time */
34
+ int l = 0 , r = 0 , idx = 0 , mid = length /2 , count = 0 ;
35
+ if (length <= 1 ) return 0 ;
36
+
37
+ int * left = copySubArray (arr , 0 , mid );
38
+ int * right = copySubArray (arr , mid , length );
39
+
40
+ count += countInversions (left , mid );
41
+ count += countInversions (right , length - mid );
42
+
43
+ while (l < mid && r < length - mid ) {
44
+ if (left [l ] <= right [r ]) // no inversions in this case
45
+ arr [idx ++ ] = left [l ++ ];
46
+ else { // total number of inversions to add
47
+ arr [idx ++ ] = right [r ++ ]; // is the number of elements currently
48
+ count += mid - l ; // left in the left subarray: mid - l
55
49
}
56
- idx ++ ;
57
- }
58
- while (l < mid ) {
59
- arr [idx ] = left [l ];
60
- idx ++ ;
61
- l ++ ;
62
- }
63
- while (r < length - mid ) {
64
- arr [idx ] = right [r ];
65
- idx ++ ;
66
- r ++ ;
67
50
}
51
+
52
+ while (l < mid )
53
+ arr [idx ++ ] = left [l ++ ];
54
+
55
+ while (r < length - mid )
56
+ arr [idx ++ ] = right [r ++ ];
57
+
68
58
free (left );
69
59
free (right );
70
- return count ;
60
+ return count ;
71
61
}
72
62
73
63
int * readIntVector (int size ) {
@@ -81,7 +71,7 @@ int main(int argc, char **argv){
81
71
int size ;
82
72
(void )! scanf ("%d\n" , & size );
83
73
int * vect = readIntVector (size );
84
- printf ("%d\n" , mergeSort ( size , vect ));
74
+ printf ("%d\n" , countInversions ( vect , size ));
85
75
free (vect );
86
76
return 0 ;
87
77
}
0 commit comments