https://www.jianshu.com/p/33cffa1ce613
归并排序
将两个有序的数组进行比较,将比较结果放在一个临时数组中,最后将临时数组赋值给原数组;
将一个数组分割为两个数组,在对每个数组进行再次分割,直到都是一个单一的元素后(一个元素当然是有序的)
进行两个元素进行比较,结果放在临时数组,再复制到原数组中,进行递归回溯,直到最后变成两个有序的数组进行比较
void mergeCount(int a[], int L, int mid, int R)
{
int *tmp = new int[L + mid + R];
int i = L;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= R)
{
if (a[i] < a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
/// 判断哪个⼦数组中有剩余的数据
while (i <= mid)
tmp[k++] = a[i++];
while (j <= R)
tmp[k++] = a[j++];
/// 将 tmp 中的数组拷⻉回 A[p...r]
for (int p = 0; p < k; ++p)
a[L + p] = tmp[p];
delete []tmp;
}
void mergeSort(int a[], int L, int R)
{
/// 递归终⽌条件 分治递归
/// 将 A[L...m] 和 A[m+1...R] 合并为 A[L...R]
if (L >= R)
{
return;
}
int mid = L + (R - L) / 2;
mergeSort(a, L, mid);
mergeSort(a, mid + 1, R);
mergeCount(a, L, mid, R);
}
int main()
{
int a[] = {1,3,5,2,4,6};
mergeSort(a, 0, sizeof(a) / sizeof(int));
for (int i = 0; i <= 5; ++i)
{
std::cout << a[i] << " ";
}
std::cout << endl;
return 0;
}