Skip to content

Instantly share code, notes, and snippets.

@rvivek
Created May 7, 2012 01:40
Show Gist options
  • Save rvivek/2625355 to your computer and use it in GitHub Desktop.
Save rvivek/2625355 to your computer and use it in GitHub Desktop.
Merge Sort
#include <iostream>
#define REP(i,N) for( int i = 0;i < N;i++ )
using namespace std;
//Function Declarations
void mergeSort(int numbers[], int temp[], int array_size);
void m_sort(int numbers[], int temp[], int left, int right);
void merge(int numbers[], int temp[], int left, int mid, int right);
int main(){
int N; cin >> N; // Read the size of the array
int * ar = new int[N];
int * br = new int[N]; // Another array
REP(i,N) { cin >> ar[i]; }
mergeSort(ar, br, N);
return 0;
}
void mergeSort(int numbers[], int temp[], int array_size){
m_sort(numbers, temp, 0, array_size - 1);
}
void m_sort(int numbers[], int temp[], int left, int right){
int mid;
if (right > left){
mid = (right + left) / 2;
m_sort(numbers, temp, left, mid);
m_sort(numbers, temp, (mid+1), right);
merge(numbers, temp, left, (mid+1), right);
}
}
void merge(int numbers[], int temp[], int left, int mid, int right){
int i, left_end, num_elements, tmp_pos;
left_end = (mid - 1);
tmp_pos = left;
num_elements = (right - left + 1);
while ((left <= left_end) && (mid <= right)){
if (numbers[left] <= numbers[mid]){
temp[tmp_pos] = numbers[left];
tmp_pos += 1;
left += 1;
}
else{
temp[tmp_pos] = numbers[mid];
tmp_pos += 1;
mid += 1;
}
}
while (left <= left_end){
temp[tmp_pos] = numbers[left];
left += 1;
tmp_pos += 1;
}
while (mid <= right){
temp[tmp_pos] = numbers[mid];
mid += 1;
tmp_pos += 1;
}
//modified
REP(i,num_elements){
numbers[right] = temp[right];
right--;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment