问题 B: 基础排序III:归并排序
时间限制: 3 Sec 内存限制: 128 MB题目描述
归并排序是一个时间复杂度为O(nlogn)的算法,对于大量数据远远优于冒泡排序与插入排序。
这是一道排序练习题,数据量较大,请使用归并排序完成。
输入
第一行一个数字n,代表输入的组数
其后每组第一行输入一个数字m,代表待排序数字的个数
其后m行每行一个数据,大小在1~100000之间,互不相等,最多有10万个数据。
输出
升序输出排好序的数据,每行一个数字
样例输入
1
10
10
9
8
7
6
5
4
3
2
1
样例输出
1
2
3
4
5
6
7
8
9
10
User: 吴锦诚 Date: 2018/6/11
非递归并归
#include <iostream>
#include <algorithm>
#include <string.h>
using
namespace
std;
void
merge(
int
am[],
int
l1,
int
l2,
int
r1,
int
r2) {
int
index1 = l1, index2 = r1;
int
temp[100000], index = 0;
memset
(temp, 0,
sizeof
(temp));
while
(index1 <= l2 && index2 <= r2) {
if
(am[index1] < am[index2]) {
temp[index++] = am[index1++];
}
else
{
temp[index++] = am[index2++];
}
}
while
(index1 <= l2)temp[index++] = am[index1++];
while
(index2 <= r2) temp[index++] = am[index2++];
for
(
int
i = 0; i < index; i++) {
am[i+l1] = temp[i];
}
}
void
mergeSort(
int
am[],
int
n) {
int
middle;
for
(
int
step = 2; step / 2 < n; step *= 2) {
for
(
int
i = 0; i < n; i+=step) {
middle = i + step / 2 -1;
if
(middle + 1 < n) {
merge(am, i, middle, middle + 1, min(n-1, i + step-1));
}
}
}
}
int
main()
{
int
n, am[100000], m, i, j;
//输入组数n
while
(cin>>n) {
for
(i = 0; i < n; i++) {
memset
(am, 0,
sizeof
(am));
//输入待排个数m
cin >> m;
//输入m个数据
for
(j = 0; j < m; j++) {
cin >> am[j];
}
//输出数据
mergeSort(am,m);
for
(j= 0; j< m;j++) {
cout << am[j] << endl;
}
}
}
return
0;
}
/**************************************************************
Problem: 3105
User: morizunzhu
Language: C++
Result: 正确
Time:1976 ms
Memory:2676 kb
****************************************************************/
递归归并
#include <iostream>
#include <algorithm>
#include <string.h>
using
namespace
std;
void
merge(
int
am[],
int
l1,
int
l2,
int
r1,
int
r2) {
int
index1 = l1, index2 = r1;
int
temp[100000], index = 0;
memset
(temp, 0,
sizeof
(temp));
while
(index1 <= l2 && index2 <= r2) {
if
(am[index1] < am[index2]) {
temp[index++] = am[index1++];
}
else
{
temp[index++] = am[index2++];
}
}
while
(index1 <= l2)temp[index++] = am[index1++];
while
(index2 <= r2) temp[index++] = am[index2++];
for
(
int
i = 0; i < index; i++) {
am[i + l1] = temp[i];
}
}
void
mergeSort(
int
am[],
int
left,
int
right) {
if
(left < right) {
int
mid = left+(right-left)/2;
mergeSort(am, left, mid);
mergeSort(am, mid + 1, right);
merge(am, left, mid, mid + 1, right);
}
}
int
main()
{
int
n, am[100000], m, i, j;
//输入组数n
while
(cin >> n) {
for
(i = 0; i < n; i++) {
memset
(am, 0,
sizeof
(am));
//输入待排个数m
cin >> m;
//输入m个数据
for
(j = 0; j < m; j++) {
cin >> am[j];
}
//输出数据
mergeSort(am, 0,m-1);
for
(j = 0; j < m; j++) {
cout << am[j] << endl;
}
}
}
return
0;
}
/**************************************************************
Problem: 3105
User: morizunzhu
Language: C++
Result: 正确
Time:1996 ms
Memory:2676 kb
****************************************************************/
提交编号 | 用户 | 问题 | 结果 | 内存 | 耗时 | 语言 | 代码长度 | 提交时间 | 判题机 |
---|---|---|---|---|---|---|---|---|---|
1384928 | morizunzhu | 正确 |
2676
|
1996
| C++/Edit | 1187 B | 2018-06-11 01:47:31 | discovery | |
1384927 | morizunzhu | 运行错误20% |
2680
|
24
| C++/Edit | 1155 B | 2018-06-11 01:41:08 | discovery | |
1384926 | morizunzhu | 正确 |
2676
|
1976
| C++/Edit | 1227 B | 2018-06-11 01:31:30 | discovery |