时间复杂度:O(nlogn)
许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关的若干子问题。这些算法典型地遵循分治法的思想:将几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。
分治模式在每层递归时都有三个步骤:
1.分解原问题为若干子问题,这些子问题时原问题的规模较小的实例。
2.解决这些子问题,递归地求解各子问题。然后,若子问题的规模足够小,则直接求解。
3.合并这些子问题的解成原问题的解。
//如果给你两个分别有序的数组,你该怎么排?
//a数组分成两个部分:a[left]-a[mid] a[mid+1]-a[right]
void merge(int temp[], int a[], int left, int mid, int right)
{
int k = left;
int i = left;
int j = mid+1;
while (i <= mid && j <= right)
{
if (a[i] <= a[j])
{
temp[k++] = a[i++];
}
else
{
temp[k++] = a[j++];
}
}
while (i <= mid)
{
temp[k++] = a[i++];
}
while (j <= right)
{
temp[k++] = a[j++];
}
//排序之后说明a数组的left到right 是正序
for (i = left; i <= right; i++)
{
a[i] = temp[i];
}
}
//递归
void merge_sort(int temp[],int a[], int left, int right)
{
//先写递归出口
if (left == right)
{
return;
}
//再写递归式子
else
{
int mid = (left + right) / 2;
//递归调用左侧
merge_sort(temp, a, left, mid);
//递归调用右侧
merge_sort(temp, a, mid+1, right);
//此时左侧和右侧已经有序,合并两个有序的数组
merge(temp, a, left, mid, right);
}
}