- 归并排序(MergeSort)
是建立在归并操作上的一一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,则称为二路归并。
- 核心思想为:
- 具体代码如下:
void _MergeSort(int* a, int left, int right,int* tmp)//归并排序
{
if (left >= right)
{
return;
}
int mid = left + ((right - left) >> 1);
//左边区间为[left,mid]
_MergeSort(a, left, mid,tmp);
//右边区间为[mid+1,right]
_MergeSort(a, mid+1, right,tmp);
//进行归并
int index = left;
int begin1 = left, end1 = mid;
int begin2 = mid + 1, end2 = right;
while (begin1 <= end1&&begin2 <= end2)
{
if (a[begin1] < a[begin2])
{
tmp[index++] = a[begin1++];
}
else
{
tmp[index++] = a[begin2++];
}
}
//此时有一个链表已经为空
while (begin1 <=end1)
{
tmp[index++] = a[begin1++];
}
while (begin2 <=end2)
{
tmp[index++] = a[begin2++];
}
//把tmp数组的内容拷回原数组
memcpy(a + left, tmp + left, sizeof(int)*(right - left + 1));
}
void MergeSort(int* a, int n)//归并排序
{
assert(a);
int* tmp = (int*)malloc(sizeof(int)*n);
_MergeSort(a,0,n-1,tmp);
free(tmp);
}
- 总结:
1.归并的缺点:在于需要O(N)的空间复杂度;归并排序,更多的是解决在磁盘中的外排序问题。
2.时间复杂度: O(N*IogN)
3.空间复杂度: O(N)
4.稳定性: 稳定