归并排序
思想
将已有的数组依次拆分到不可拆分为止,再使得每个子序列有序,再使子序列段有序,最终将子序列段组合成为有序的数组。
核心步骤
代码实现:
void _MergeSort(int* a, int begin, int end, int* tmp)
{
if (begin >= end)//设置递归返回条件
return;
int mid = begin + ((end - begin) >> 1);
_MergeSort(a, begin, mid, tmp);//拆分区间在[begin , mid]之间的数
_MergeSort(a, mid + 1, end, tmp);//拆分区间在[mid + 1, end]
int begin1 = begin, end1 = mid;
int begin2 = mid + 1, end2 = end;
int index = begin;//注意index标记的是小标begin所在的位置,而不是从0开始
while (begin1 <= end1 && begin2 <= end2)
{
if (a[begin1] < a[begin2])
tmp[index++] = a[begin1++];//将两个数组中小的数赋值给tmp
else
tmp[index++] = a[begin2++];
}
while (begin1 <= end1)
{
tmp[index++] = a[begin1++];
}
while (begin2 <= end2)
{
tmp[index++] = a[begin2++];
}
//重新将tmp中的数拷贝回a中去
index = begin;
while (begin <= end)
{
a[begin++] = tmp[index++];
}
}
void MergeSort(int* a, int n)
{
int* tmp = new int[n];//创造一个空间大小和原数组一样的数组
_MergeSort(a, 0, n - 1, tmp);
}
代码样例 :
int main()
{
int a[] = { 10, 6, 7, 1, 3, 9, 4, 2 };
int n = sizeof(a) / sizeof(a[0]);
MergeSort(a, n);
for (auto e : a)
{
cout << e << " ";
}
system("pause");
return 0;
}
代码实现:
特点:
1.缺点在于需要空间复杂度为O(n)
2.时间复杂度O(n*logn)
3.稳定性:稳定