|
|
|
|
@ -0,0 +1,46 @@
|
|
|
|
|
//代码如下
|
|
|
|
|
#include<iostream>
|
|
|
|
|
using namespace std;
|
|
|
|
|
const int N = 1e5 + 10;
|
|
|
|
|
int q[N],tmp[N];
|
|
|
|
|
int n;
|
|
|
|
|
|
|
|
|
|
void Merge_sort(int l,int r)
|
|
|
|
|
{
|
|
|
|
|
if(l >= r) return ;
|
|
|
|
|
int mid = r + l >> 1;
|
|
|
|
|
Merge_sort(l,mid);
|
|
|
|
|
Merge_sort(mid+1,r);
|
|
|
|
|
int i = l, j = mid + 1, k = 0;
|
|
|
|
|
while(i <= mid && j <= r)
|
|
|
|
|
{
|
|
|
|
|
if(q[i] < q[j]) tmp[k++]=q[i++];
|
|
|
|
|
else tmp[k++]=q[j++];
|
|
|
|
|
}
|
|
|
|
|
while(i <= mid) tmp[k++] = q[i++];
|
|
|
|
|
while(j <= r) tmp[k++] = q[j++];
|
|
|
|
|
for(int i=l,j=0; i <= r; i++, j++)
|
|
|
|
|
q[i] = tmp[j];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main()
|
|
|
|
|
{
|
|
|
|
|
cin >> n;
|
|
|
|
|
for(int i=0;i<n;i++) cin>>q[i];
|
|
|
|
|
Merge_sort(0,n-1);
|
|
|
|
|
for(int i=0;i<n;i++) cout<<q[i]<<' ';
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//时间复杂度:o(n*log n)
|
|
|
|
|
//运行时间:1s内
|
|
|
|
|
/*
|
|
|
|
|
算法步骤:
|
|
|
|
|
1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
|
|
|
|
|
2.设定两个指针,最初位置分别为两个已经排序序列的起始位置;
|
|
|
|
|
3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
|
|
|
|
|
4.重复步骤 3 直到某一指针达到序列尾;
|
|
|
|
|
5.将另一序列剩下的所有元素直接复制到合并序列尾。*/
|
|
|
|
|
//适用场景:若要求排序稳定,则可选用归并排序。
|
|
|
|
|
//思想:“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表,归并排序和快排一样也采用的是分治的思想,它的基本原理是通过对若干个有序结点序列的合并为一个有序序列来实现排序的。
|
|
|
|
|
|