排序问题

排序问题

Time Limit: 1000MS Memory limit: 65536K

题目描述

输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。

输入

输入数据有一行,包含10个整数,用空格分开。

输出

输出数据有两行,第一行为排序后的序列,第二行为排序后各个元素在原来序列中的位置。

示例输入

1 2 3 5 4 6 8 9 10 7

示例输出

1 2 3 4 5 6 7 8 9 10
1 2 3 5 4 6 10 7 8 9

源码(用结构体):

#include <stdio.h>
struct data
{
	int n;//数值
	int cur;//位置
};

int main()
{
	struct data arr[10];//C语言中必须用要写struct。。不然GCC是不会通过的。。
	struct data t;
	int i,j;
	for(i=0; i<10; i++)
	{
		scanf("%d",&arr[i]);//输入数值
		arr[i].cur=i+1;//保持位置序号
	}
	for(i=0; i<10-1; i++)
	{
		for(j=0; j<10-i-1; j++)
		{
			if(arr[j].n > arr[j+1].n)
			{	
				t=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=t;
			}
		}
	}
	for(i=0; i<10; i++)
	{
		if( i != 0 )
			printf(" %d",arr[i].n);
		else
			printf("%d",arr[i].n);
	}
	putchar('\n');
	for(i=0; i<10; i++)
	{
		if(i != 0)
			printf(" %d",arr[i].cur);
		else
			printf("%d",arr[i].cur);
	}
	putchar('\n');
	return 0;
}


或者(用两个数组):

#include <stdio.h>

int main()
{
	int arr1[10],arr2[10];//arr1[10]用来存储数值,arr2[10]用来存储位置
	int t;
	int i,j;
	for(i=0; i<10; i++)
	{
		scanf("%d",&arr1[i]);//输入数值
		arr2[i]=i+1;//保持位置序号
	}
	for(i=0; i<10-1; i++)//冒泡
	{
		for(j=0; j<10-i-1; j++)
		{
			if(arr1[j] > arr1[j+1])
			{	
				t=arr1[j];
				arr1[j]=arr1[j+1];
				arr1[j+1]=t;

				t=arr2[j];
				arr2[j]=arr2[j+1];
				arr2[j+1]=t;
			}
		}
	}
	for(i=0; i<10; i++)//输出
	{
		if( i != 0 )//AC对输出格式好像非常严格。。。
			printf(" %d",arr1[i]);
		else
			printf("%d",arr1[i]);
	}
	putchar('\n');
	for(i=0; i<10; i++)
	{
		if(i != 0)
			printf(" %d",arr2[i]);
		else
			printf("%d",arr2[i]);
	}
	putchar('\n');
	return 0;
}






原文地址:https://www.cnblogs.com/tanhehe/p/2883531.html