基础练习 数列排序

Description

给定一组或多组数列,将这个数列按从小到大的顺序排列,这些数列的长度大于等于1,小于等于200

!必须用二路归并排序算法完成本题!

Input

输入描述:

每组数的第一行为一个整数n,第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。注意输入可能有多组

输入样例:

5

8 3 6 4 9

3

2 -3 7

注:根据上面的输入描述,获取输入的C语言语句可以写成:

int n,i;

while(scanf("%d",&n)!=EOF){ //先读取第一行得到n,即下一行有n个数

for(i=0;i<n;i++)  //再循环n次读取该行的n个数
//排序

}

Output

输出描述:

输出一行,按从小到大的顺序输出排序后的数列。

输出样例:

3 4 6 8 9

-3 2 7

Sample Input 1 

3
1 7 -1
6
1 2 3 4 5 -1

Sample Output 1

-1 1 7
-1 1 2 3 4 5
#include<bits/stdc++.h>

using namespace std;
const int N = 1e6;

int n,tmp[N],perm[N];


void merge_sort(int arr[],int l, int r)
{
	if(l >= r) return; //双指针相遇不用排序,直接返回
	
	int mid = l + r >> 1;//位运算,等价于除2,更快
	merge_sort(arr,l, mid);
	merge_sort(arr,mid+1,r);
	
	int k = 0,i = l, j = mid + 1;
	while(i <= mid && j <= r)
	{
		if(arr[i] <= arr[j]) tmp[k++] = arr[i++];
		else tmp[k++] = arr[j++];
	}  
	
	while(i <= mid) tmp[k++] = arr[i++];
	while(j <= r) tmp[k++] = arr[j++];
	
	for(int i = l, j = 0;i <= r; i ++, j ++) arr[i] = tmp[j];
}
int main()
{
	while(cin >> n)
	{
		for(int i = 0; i < n; i ++)
			cin >> perm[i];
		
		merge_sort(perm,0,n - 1);
		for(int i = 0; i < n; i ++) cout << perm[i] << " ";
		cout << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值