Coder Pat之路 问题 B: 基础排序III:归并排序

问题 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 正确 2018-06-11 01:47:31
1384927 morizunzhu 运行错误20% 2018-06-11 01:41:08
1384926 morizunzhu 正确 2018-06-11 01:31:30
1-递归 3-循环

猜你喜欢

转载自blog.csdn.net/morizunzhu/article/details/80646656
今日推荐