给定你一个长度为 n 的整数数列。
请你使用归并排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
-
输入共两行,第一行包含整数 n。
-
第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。
输出格式
- 输出共一行,包含 n 个整数,表示排好序的数列。
数据范围 1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
AC:
/*
归并排序
5
3 1 2 4 5
1 2 3 4 5
*/
#include <iostream>
#include <algorithm>
using namespace std;
void merge(int array[], int start, int mid, int end);
void msort(int arr[], int start, int end);
int main()
{
std::ios_base::sync_with_stdio(false);
int n;
cin >> n;
int *a = new int[n];
for (int i = 0; i < n; i++)
cin >> a[i];
msort(a, 0, n);
merge(a, 0, n / 2, n);
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
delete[] a;
return 0;
}
void merge(int array[], int start, int mid, int end)
{
//开辟额外大集合,设置指针
int *tempArray = new int[end - start + 1];
int p1 = start, p2 = mid + 1, p = 0;
//比较两个小集合的元素,依次放入大集合
while (p1 <= mid && p2 <= end)
{
if (array[p1] <= array[p2])
tempArray[p++] = array[p1++];
else
tempArray[p++] = array[p2++];
}
//左侧小集合还有剩余,依次放入大集合尾部
while (p1 <= mid)
tempArray[p++] = array[p1++];
//右侧小集合还有剩余,依次放入大集合尾部
while (p2 <= end)
tempArray[p++] = array[p2++];
//把大集合的元素复制回原数组
for (int i = 0; i < end - start + 1; i++)
array[i + start] = tempArray[i];
}
void msort(int arr[], int start, int end)
{
if (start == end)
return;
else if (end - start == 1)
{
if (arr[start] > arr[end])
swap(arr[start], arr[end]);
else
return;
}
else
{
int mid = (start + end) / 2;
msort(arr, start, mid);
msort(arr, mid + 1, end);
merge(arr, start, mid, end);
}
}
CONCLUSION:
- 对于归并算法中合并部分掌握的不熟练!
- 就本题而言,完全可以用
sort
函数排序,也是AC
的。 - 对
c++ class
的用法感到好奇?