So here is how it's done. It's quite a lot of code, but it's easy to understand:
1: void mergeSort(int arr[], int first, int last) {
2: int SIZE = last - first;
3: if (SIZE <= 1)
4: return;
5: //if only 2 elements exist, just swap if necessary
6: if (SIZE == 2) {
7: if (arr[first] > arr[last - 1]) {
8: int tmp = arr[first];
9: arr[first] = arr[last - 1]; 10: arr[last - 1] = tmp; 11: }12: return;
13: }14: //otherwise find the middle
15: //and apply merge sort for each half
16: int half = first + SIZE / 2;
17: 18: mergeSort(arr, first, half); 19: mergeSort(arr, half, last); 20: 21: int i = first;
22: int j = half;
23: int* temp = new int[SIZE];
24: memset(temp, 0, sizeof(int) * SIZE);
25: int k = 0;
26: //after both halfs are sorted
27: //merge them together in one big sorted list
28: while (i < half || j < last) {
29: if (i < half && j < last) {
30: if (arr[i] < arr[j]) {
31: temp[k] = arr[i]; 32: i++;33: } else {
34: temp[k] = arr[j]; 35: j++; 36: }37: } else if (i < half) {
38: temp[k] = arr[i]; 39: i++;40: } else {
41: temp[k] = arr[j]; 42: j++; 43: } 44: ++k; 45: }46: //overrite the original array with the sorted elements
47: for (int m = 0; m < SIZE; m++)
48: arr[first + m] = temp[m]; 49: delete[] temp; 50: }