Problem Description
归并排序是基于归并操作完成的,而一次归并操作是通过两个或两个以上的有序表合并成一个新的有序表完成的。常见的归并排序是2-路归并排序,其核心操作是将一维数组中前后相邻的两个有序序列归并成一个有序序列。其算法可以描述如下:
Input Description
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
Output Description
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
Sample Input
10 2 8 4 6 1 10 7 3 5 9
Sample Output
1 2 3 4 5 6 7 8 9 10
Hint
#include<stdio.h>
void merge_sort(int* a, int left, int mider, int right)
{
int arr[right - left + 1];
int i = left;
int j = mider + 1;
int k = 0;
while(i <= mider && j <= right) // 两个序列作比较 ,小者入序列
{
arr[k++] = (a[i] < a[j]) ? a[i++] : a[j++];
}
while(i <= mider) // 当 右 半部分完结,左半分未完结时
{
arr[k++] = a[i++];
}
while(j <= right) // 当 左 半部分完结,右半分未完结时
{
arr[k++] = a[j++];
}
for(k = left ; k <= right ; k++)
{
a[k] = arr[k - left];
}
}
void process(int* a, int left, int right)
{
if(left == right) //该部分归并完毕
{
return ;
}
int mider = left + (right - left) / 2; // 寻找该序列中点
process(a, left, mider);
process(a, mider + 1, right);
merge_sort(a, left, mider, right);
}
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i = 0 ; i < n ; i++)
{
scanf("%d", &a[i]);
}
process(a, 0, n-1);
for(int i = 0 ; i < n ; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
提示:
总结: