归并排序原理介绍
归并排序利用“分治”的思想,将一个长度为n的待排数组不断的二分为原来的一半;经过logn次之后,每段就将只剩下1个元素,这样的元素段一共有n段,至此,“归“的部分已经完成。(请结合下图理解)这部分的时间复杂度为logn。
剩下的就是”并“的部分,每次”并“操作都对相邻两段内的元素进行排序,完成排序之后合并为一段,总段数变为一半,经过logn次合并排序之后,整个数组变为有序的一整段,排序完毕。这部分的时间复杂度为n*logn。由于合并过程中的排序需要先把原数组中的元素复制到临时数组,待排好序之后再返回至原数组,所以需要开辟跟原数组大小一样的空间,因此空间复杂度为O(n)。
具体的原理图如下:
归并排序代码
递归完成”归“部分函数:
//原版
void merge_sort(int p[], int l, int r)
{
int temp;
int mid = (l + r) / 2;
if (r<=l)
return;
merge_sort(p, l, mid);
merge_sort(p, mid + 1, r);
merge(p, l