Skip to content

Instantly share code, notes, and snippets.

@Per48edjes
Last active May 28, 2022 04:44
Show Gist options
  • Save Per48edjes/ce5f75621168060f7b5c8a9c4580c65f to your computer and use it in GitHub Desktop.
Save Per48edjes/ce5f75621168060f7b5c8a9c4580c65f to your computer and use it in GitHub Desktop.
Implementation of merge sort on array of integers in C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int * merge_sort(int *parr, int arr_len);
void print_array(int *arr, int len_arr);
int main(void)
{
int items[] = { 5, 2, 7, 4, 1, 6, 3, 0 };
int len_items = sizeof(items) / sizeof(*items);
// Print original order
print_array(items, len_items);
// Merge sort
merge_sort(items, len_items);
// Print sorted order
print_array(items, len_items);
return EXIT_SUCCESS;
}
int * merge_sort(int *parr, int arr_len)
{
if (arr_len == 1)
{
return parr;
}
/* Split array into two half-arrays */
// Lengths of each half-array
int left_len = arr_len / 2;
int right_len = arr_len - left_len;
// Pointers to first index in each half-array
int *pleft = parr;
int *pright = parr + left_len;
/* Sort each half-array */
int *left = merge_sort(pleft, left_len);
int *right = merge_sort(pright, right_len);
/* Merge the two half-arrays */
// Use "shelf" array to merge
int *shelf_arr = (int *)malloc(arr_len * sizeof(int));
// Merge
int is_end_of_left = 0;
int is_end_of_right = 0;
int *end_of_left = left + left_len;
int *end_of_right = right + right_len;
for (int i = 0; i < arr_len; ++i)
{
if (!is_end_of_left && !is_end_of_right)
{
if (*left < *right)
{
shelf_arr[i] = *left;
++left;
}
else
{
shelf_arr[i] = *right;
++right;
}
}
else if (is_end_of_left && !is_end_of_right)
{
shelf_arr[i] = *right;
++right;
}
else
{
shelf_arr[i] = *left;
++left;
}
is_end_of_left = (left < end_of_left) ? 0 : 1;
is_end_of_right = (right < end_of_right) ? 0 : 1;
}
// Copy from "shelf" array into original array
memcpy(parr, shelf_arr, arr_len * sizeof(int));
free(shelf_arr);
return parr;
}
void print_array(int *arr, int len_arr)
{
for (int i = 0; i < len_arr; ++i)
{
printf("%d ", arr[i]);
if (len_arr - 1 == i)
{
printf("\n");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment