题目1:归并排序

给定你一个长度为 n的整数数列。

请你使用归并排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行为整数 n

第二行包含n个整数,表示整个数列。

输出格式

输出共一行,包含n个整数,表示排好序的数列。

数据范围

1≤n≤100000

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5

代码:

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 
 5 vector<int> merge(vector<int> a, vector<int> b)
 6 {
 7     vector<int> vec;
 8     unsigned int i = 0;
 9     unsigned int j = 0;
10     while (i < a.size() && j < b.size())
11     {
12         if (a[i] <= b[j])
13         {
14             vec.push_back(a[i]);
15             i++;
16         }
17         else
18         {
19             vec.push_back(b[j]);
20             j++;
21         }
22     }
23     if (j < b.size())
24     {
25         vec.insert(vec.end(), b.begin() + j, b.end());
26     }
27     if (i < a.size())
28     {
29         vec.insert(vec.end(), a.begin() + i, a.end());
30     }
31     return vec;
32 }
33 vector<int> detach_merge(vector<int> vec)
34 {
35     if (vec.size() <= 1)
36     {
37         return vec;
38     }
39     int start = 0;
40     int end = vec.size();
41     int mid = (start + end) / 2;               //对原问题进行分解
42     vector<int> left(vec.begin(), vec.begin() + mid);  //子问题A
43     vector<int> right(vec.begin() + mid, vec.end());   //子问题B
44 
45     left = detach_merge(left);                //对子问题A进行递归分解
46     right = detach_merge(right);               //对子问题B进行递归分解
47 
48     return merge(left,right );                 //合并子问题A和子问题B的解得到原问题的解
49      
50 }
51 
52 
53 int main()
54 {
55     int n;
56     cin >> n;
57     vector<int> vec;
58     for (int i = 0; i < n; i++)
59     {
60         int tmp;
61         cin >> tmp;
62         vec.push_back(tmp);
63     }
64     vector<int> result = detach_merge(vec);
65     for (auto x : result)
66     {
67         cout << x << " ";
68     }
69     return 0;
70 }

 

posted on 2022-09-19 15:02  yc-limitless  阅读(20)  评论(0)    收藏  举报