分治与递归--合并排序
作者:互联网
题目描述
采用递归与非递归两种方式实现合并排序算法
参考输入、输出:
输入:输入第一行包括一个整数n,第二行包含n个整数,以空格间隔。
输出:输出一行n个整数,代表排序结果。
Simple input:
4
1 5 4 12
Simple output:
1 4 5 12
题目思路
- 非递归没看懂
时间复杂度
题目代码
- 递归写法:
#include <iostream>
using namespace std;
const int N = 1e5;
int n;
int a[N], b[N];
void Merge(int c[], int d[], int l, int m, int r) // 合并c[l:m]和c[m+1:r]到d[l:r]
{
int i = l, j = m + 1, k = l;
while (i <= m && j <= r)
{
if(c[i] <= c[j])
d[k ++] = c[i ++];
else
d[k ++] = c[j ++];
}
if(i > m)
{
for(int q = j; q <= r; q ++ )
d[k ++] = c[q];
}
else
{
for(int q = i; q <= m; q ++ )
d[k ++] = c[q];
}
}
void Copy(int a[], int b[], int l, int r)
{
for(int i = l; i <= r; i ++ ) a[i] = b[i];
}
void MergeSort(int a[], int l, int r)
{
if(l < r)
{
int mid = l + r >> 1;
MergeSort(a, l, mid);
MergeSort(a, mid + 1, r);
Merge(a, b, l, mid, r); // 将排序结果合并到数组b
Copy(a, b, l, r); // 复制回数组a
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++ ) cin >> a[i];
MergeSort(a, 1, n);
for(int i = 1; i <= n; i ++ ) cout << a[i] << " ";
return 0;
}
- 非递归写法
#include <iostream>
using namespace std;
const int N = 1e5;
int n;
int a[N], b[N];
void Merge(int c[], int d[], int l, int m, int r)
{
int i = l, j = m + 1, k = l;
while (i <= m && j <= r)
{
if(c[i] <= c[j])
d[k ++] = c[i ++];
else
d[k ++] = c[j ++];
}
if(i > m)
{
for(int q = j; q <= r; q ++ )
d[k ++] = c[q];
}
else
{
for(int q = i; q <= m; q ++ )
d[k ++] = c[q];
}
}
void MergePass(int x[], int y[], int s, int n) // 合并大小为s的相邻子数组
{
int i = 0;
while(i <= n - 2 * s){
Merge(x, y, i, i + s - 1, i + 2 * s - 1); // 合并大小为s的相邻2段子数组
i = i + 2 * s;
}
if(i + s < n) // 剩下的元素个数少于2s
Merge(x, y, i, i + s - 1, n - 1);
else
for(int j = i; j <= n - 1; j ++ )
y[j] = x[j];
}
void MergeSort(int a[], int n)
{
int s = 1;
while(s < n)
{
MergePass(a, b, s, n);
s += s;
MergePass(b, a, s, n);
s += s;
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++ )
cin >> a[i];
MergeSort(a, n);
for(int i = 1; i <= n; i ++ )
cout << a[i] << " ";
return 0;
}
标签:MergeSort,递归,Merge,--,分治,mid,int,排序 来源: https://www.cnblogs.com/esico/p/16297796.html