void __merge_sort(T *data, T *reg, int start, int end) { if(start >= end) { return; } int length = end - start; int mid = (end + start) / 2; int start1 = start, end1 = mid; int start2 = mid + 1, end2 = end; __merge_sort(data, reg, start1, end1); __merge_sort(data, reg, start2, end2); int index = start; while(start1 <= end1 && start2 <= end2) { reg[index ++] = (data[start1] < data[start2]) ? data[start1 ++] : data[start2 ++]; } while(start1 <= end1) { reg[index ++] = data[start1 ++]; } while(start2 <= end2) { reg[index ++] = data[start2 ++]; } for(index = start; index <= end; index ++) { data[index] = reg[index]; } }
static void __merge_sort (struct aux_data* aux, size_t start, size_t end) { if (start < (end - 1)) { size_t middle = (start + end) >> 1; __merge_sort(aux, start, middle); __merge_sort(aux, middle, end); merge(aux, start, middle, end); }
void __merge_sort(int *arr, int p, int r) { int q; if (p >= r) return; q = (p + r) / 2; __merge_sort(arr, p, q); __merge_sort(arr, q + 1, r); __merge(arr, p, q, r); }
void merge_sort(int *arr, int size) { __merge_sort(arr, 0, size - 1); }
void binaryMergingSort(T *data, int length){ T *reg = new T[length]; __merge_sort(data, reg, 0, length-1); }