归并排序(MERGE-SORT)
1.当我们要排序这样一个数组的时候,归并排序法首先将这个数组分成一半
2.然后想办法把左边的数组给排序,右边的数组给排序,之后呢再将它们归并起来。
3.当然了当我们对左边的数组和右边的数组进行排序的时候,再分别将左边的数组和右 边的数组分成一半,然后对每一个部分先排序,再归并
4.分到一定细度的时候,每一个部分就只有一个元素了,那么我们此时不用排序,对他们进行一次简单的归并就好了
5.归并到上一个层级之后继续归并,归并到更高的层级,直至最后归并完成。
我们可以开辟一个临时数组来辅助我们的归并。也就是说他比我们插入排序也好,选择排序也好多使用了存储的空间,
也就是说他需要o(n)的额外空间来完成这个排序。只不过现在计算机中时间的效率要比空间的效率重要的多。
无论是内存也好还是硬盘也好可以存储的数据越来越多,所以设计一个算法,时间复杂度是要优先考虑的。
详细图解点击这里
归并排序代码如下:
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int a[N], b[N];
void merge_sort(int l, int r)
{
if(l >= r) return ;
int mid = l + r >> 1;
merge_sort(l, mid);
merge_sort(mid + 1, r);
int i = l, j = mid + 1;
for(int k = l; k <= r; k++){
if(j > r || (i <= mid && a[i] < a[j]))b[k] = a[i++];
else b[k] = a[j++];
}
for(int k = l; k <= r; k++)a[k] = b[k];
}
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];
merge_sort(0, n - 1);
for(int i = 0; i < n; i++)
cout << a[i] << ' ';
return 0;
}
1097

被折叠的 条评论
为什么被折叠?



