题目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 }
浙公网安备 33010602011771号