Skip to content

Instantly share code, notes, and snippets.

@barrysteyn
Last active August 6, 2017 02:08
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save barrysteyn/5177637 to your computer and use it in GitHub Desktop.
Save barrysteyn/5177637 to your computer and use it in GitHub Desktop.
Merge sort example in C
#include<iostream>
#include "mergesort.c"
using namespace std;
int main(int argc, char** argv) {
int num;
cout << "How many numbers do you want to sort: ";
cin >> num;
int a[num];
for (int i = 0; i < num; i++) {
cout << (i + 1) << ": ";
cin >> a[i];
}
// Start merge sort
mergeSort(a, num);
// Print the sorted array
cout << endl;
for (int i = 0; i < num; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
void merge(int *arr, int size1, int size2, int *inversions) {
int temp[size1+size2];
int ptr1=0, ptr2=0;
while (ptr1+ptr2 < size1+size2) {
if (ptr1 < size1 && arr[ptr1] <= arr[size1+ptr2] || ptr1 < size1 && ptr2 >= size2)
temp[ptr1+ptr2] = arr[ptr1++];
if (ptr2 < size2 && arr[size1+ptr2] < arr[ptr1] || ptr2 < size2 && ptr1 >= size1) {
temp[ptr1+ptr2] = arr[size1+ptr2++];
*inversions += size1-ptr1;
}
}
for (int i=0; i < size1+size2; i++)
arr[i] = temp[i];
}
void mergeSort(int *arr, int size, int* inversions) {
if (size == 1)
return;
int size1 = size/2, size2 = size-size1;
mergeSort(arr, size1, inversions);
mergeSort(arr+size1, size2, inversions);
merge(arr, size1, size2, inversions);
}
void merge(int *arr, int size1, int size2) {
int temp[size1+size2];
int ptr1=0, ptr2=0;
while (ptr1+ptr2 < size1+size2) {
if (ptr1 < size1 && arr[ptr1] <= arr[size1+ptr2] || ptr1 < size1 && ptr2 >= size2)
temp[ptr1+ptr2] = arr[ptr1++];
if (ptr2 < size2 && arr[size1+ptr2] < arr[ptr1] || ptr2 < size2 && ptr1 >= size1)
temp[ptr1+ptr2] = arr[size1+ptr2++];
}
for (int i=0; i < size1+size2; i++)
arr[i] = temp[i];
}
void mergeSort(int *arr, int size) {
if (size == 1)
return;
int size1 = size/2, size2 = size-size1;
mergeSort(arr, size1);
mergeSort(arr+size1, size2);
merge(arr, size1, size2);
}
@drankinatty
Copy link

An equal sign need not provide a sequence point. in arr[ptr1++] the value for the index is ptr1 before the side effect of the postfix operator is applied to the pointer. C11 Standard (draft n1570) §6.5.2.4 Postfix increment and decrement operators (2)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment