时间复杂度是O(N*lgN)
核心概念:先分后治
例子: 4 3 2 1
分
先将4 3 2 1分为 4 3 和 2 1
治
再 对 4 3 进行排序 3 4
对 2 1 进行排序 1 2
最后成 1 2 3 4
分的核心代码
void sort(int* a, int start, int end) //对数组进行递归割分,直到2个数为一组为止
{
if(a==NULL || start >= end)
return ;
int mid = (end + start)/2;
sort(a, start, mid);
sort(a, mid+1, end);
merge(a, start, mid, end); //治,对每一分割的数组进行有序排列 先存储在temp数组中,最后整合到a数组中
}
void merge(int* a, int start, int mid, int end)
int *tmp = new int[end-start+1]; // 定义临时数组
int i = start;
int j = mid + 1;
int k = 0;
在两组已排序的数组中,两两相互比较大小,若某一组比较完毕,另一组数组的值直接添加便可。
while(i <= mid && j <= end)
{
if (a[i] <= a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
while(i <= mid)
tmp[k++] = a[i++];
while(j <= end)
tmp[k++] = a[j++];
for (i = 0; i < k; i++)
a[start + i] = tmp[i]; //整合到数组a中。
}