Commit 2ba679e

mo khan <mo.khan@gmail.com>
2020-09-07 18:58:41
fix: correct off by one error in merge sort
1 parent fae9911
Changed files (2)
src/03/sort.c
@@ -4,16 +4,19 @@ void _merge(int *items, int min, int mid, int max)
 {
   int length = (max-min) + 1;
   int tmp[length];
+  int j = min, k = mid;
 
-  int j = 0, k = 0;
   for (int i = 0; i < length; i++) {
-    if (items[min+j] < items[mid+k]) {
-      tmp[i] = items[min+j];
-      j++;
-    } else {
-      tmp[i] = items[mid+k];
-      k++;
-    }
+    if (j < mid && k <= max)
+      if (items[j] < items[k])
+        tmp[i] = items[j++];
+      else
+        tmp[i] = items[k++];
+    else
+      if (j >= mid)
+        tmp[i] = items[k++];
+      else
+        tmp[i] = items[j++];
   }
 
   for (int i = 0; i < length; i++)
src/03/sort_test.c
@@ -57,11 +57,11 @@ Ensure(merge_sort_sorts_many_items) {
   assert_that(items[3], is_equal_to(3));
   assert_that(items[4], is_equal_to(3));
   assert_that(items[5], is_equal_to(4));
-  /*assert_that(items[6], is_equal_to(5));*/
-  /*assert_that(items[7], is_equal_to(5));*/
-  /*assert_that(items[8], is_equal_to(5));*/
-  /*assert_that(items[9], is_equal_to(6));*/
-  /*assert_that(items[10], is_equal_to(9));*/
+  assert_that(items[6], is_equal_to(5));
+  assert_that(items[7], is_equal_to(5));
+  assert_that(items[8], is_equal_to(5));
+  assert_that(items[9], is_equal_to(6));
+  assert_that(items[10], is_equal_to(9));
 }
 
 TestSuite *sort_tests() {