归并排序:
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 (合并过程可以看成树的后序遍历过程)
归并排序的步骤如下图:
代码实现归并排序:
void dealMergeSort(int *src, int *tmp, int start, int end)
{
if (start >= end)
{
return;
}
int mid = (start + end) / 2;
dealMergeSort(src, tmp, start, mid);
dealMergeSort(src, tmp, mid + 1, end);
int a = start;
int b = mid + 1;
int c = start;
while (a <= mid && b <= end)
{
if (src[a] < src[b])
{
tmp[c] = src[a];
a++;
}
else
{
tmp[c] = src[b];
b++;
}
c++;
}
for (; a <= mid; a++,c++)
{
tmp[c] = src[a];
}
for (; b <= end; b++, c++)
{
tmp[c] = src[b];
}
int i;
for (i = start; i <= end; i++)
{
src[i] = tmp[i];
}
}
void MergeSort(int * src, int n) //归并排序 //nlogn
{
int * tmp = (int *)malloc(n * sizeof (int));
dealMergeSort(src, tmp, 0, n - 1);
free(tmp);
}