Problem A: 算法10-12~10-14:归并排序

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;
}

提示:
 

总结:
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值