Problem G 排序练习00(难度5)
2017-10-21 09:02
106 查看
Problem G:
排序练习00(难度:5)
Description
话说前面的排序太简单了,
没有丝毫的挑战性, 如今给你
N 个整数, 除了要排序之外,
还要知道每个数原来的位置.
Input
输入数据有多组,
每组数据第一行包含一个数字 N(
0 < N <= 100), 代表有
N 个整数,
第二行紧跟着输入 N
个数.
Output
对于每组输入,输出数据有两行,第一行代表把数从大到小排序后的序列,第二行第
i 个数代表排序后第一行第
i 个数在原数组中的位置.如果存在一样的数,则在原先数组中序号比较大的排在序号小的前面.每两组相邻的输出之间存在一个空行.
Sample Input
5
1 2 3 4 5
2
1 1
Sample Output
5 4 3 2 1
5 4 3 2 1
1 1
2 1
HINT
对于第一组输入排序后序列为“5 4 3 2 1”, "5"
在元数组中第 5
个, “4”
原数组中第 4
个...以此类推,最终输出如样列所示;
对于第二组输入,
排序后序列为“1 1”,
由于要求如果存在一样的数,
则序号大的优先序号小的,
所以第 2
个“1”需要排在在第
1 个
“1”前面.输出如样列所示.
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,n,a[101],b[101],k=0;
while(scanf("%d",&n)!=EOF)
{
if(k!=0)
printf("\n");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
b[i]=i+1;
}//第二行第 i 个数代表排序后第一行第 i 个数在原数组中的位置
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j]<a[j+1]||(a[j]==a[j+1]&&b[j]<b[j+1]))
//如果存在一样的数,则在原先数组中序号比较大的排在序号小的前面
{
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
int y=b[j];
b[j]=b[j+1];
b[j+1]=y;
}
}
}
for(i=0;i<n;i++)
{
if(i!=0)
printf(" %d",a[i]);
else
printf("%d",a[i]);
}
printf("\n");
for(i=0;i<n;i++)
{
if(i!=0)
printf(" %d",b[i]);
else
printf("%d",b[i]);
}
printf("\n");
k++;
}
return 0;
}
排序练习00(难度:5)
Description
话说前面的排序太简单了,
没有丝毫的挑战性, 如今给你
N 个整数, 除了要排序之外,
还要知道每个数原来的位置.
Input
输入数据有多组,
每组数据第一行包含一个数字 N(
0 < N <= 100), 代表有
N 个整数,
第二行紧跟着输入 N
个数.
Output
对于每组输入,输出数据有两行,第一行代表把数从大到小排序后的序列,第二行第
i 个数代表排序后第一行第
i 个数在原数组中的位置.如果存在一样的数,则在原先数组中序号比较大的排在序号小的前面.每两组相邻的输出之间存在一个空行.
Sample Input
5
1 2 3 4 5
2
1 1
Sample Output
5 4 3 2 1
5 4 3 2 1
1 1
2 1
HINT
对于第一组输入排序后序列为“5 4 3 2 1”, "5"
在元数组中第 5
个, “4”
原数组中第 4
个...以此类推,最终输出如样列所示;
对于第二组输入,
排序后序列为“1 1”,
由于要求如果存在一样的数,
则序号大的优先序号小的,
所以第 2
个“1”需要排在在第
1 个
“1”前面.输出如样列所示.
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,n,a[101],b[101],k=0;
while(scanf("%d",&n)!=EOF)
{
if(k!=0)
printf("\n");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
b[i]=i+1;
}//第二行第 i 个数代表排序后第一行第 i 个数在原数组中的位置
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(a[j]<a[j+1]||(a[j]==a[j+1]&&b[j]<b[j+1]))
//如果存在一样的数,则在原先数组中序号比较大的排在序号小的前面
{
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
int y=b[j];
b[j]=b[j+1];
b[j+1]=y;
}
}
}
for(i=0;i<n;i++)
{
if(i!=0)
printf(" %d",a[i]);
else
printf("%d",a[i]);
}
printf("\n");
for(i=0;i<n;i++)
{
if(i!=0)
printf(" %d",b[i]);
else
printf("%d",b[i]);
}
printf("\n");
k++;
}
return 0;
}
相关文章推荐
- Problem H 排序练习01(难度5)
- Problem A 排序(难度1)
- Problem B 排序(难度3)
- Problem D: 排序(难度:3)
- Problem E 排序(难度4)
- java小练习(6)--排序 problem
- 【C++练习】排序
- Hark的数据结构与算法练习之Bogo排序
- 【数据结构与算法 00】二分插入排序
- 排序01背包 Problem W:Proud Merchants(HDU 3466)
- 按字符串长度排序——TreeSet练习
- 基础练习 数列排序
- shell练习-sort排序详解
- Hark的数据结构与算法练习之圈排序
- c++ 选择排序 练习
- linux下练习 c++ 库函数排序使用举例
- java例程练习(对象类型数据的排序)
- 课程练习四-problem V
- 基础练习 数列排序
- Scala练习-选择排序