题目:
从数组A中的N(0<N<100)个整数中从小到大进行连续编号,输出各个元素的编号。要求不能改变数组A中元素的顺序,且相同的数据要具有相同的编号。例如A=(5,3,4,7,3,5,6) 则输出(3,1,2,5,1,3,4)。
程序思路:由于不能改变输入数据顺序,定义一个num[2][100]的二维数组存储相应的数据。第一行存储输入的数据,第二行存储对应的排序(初始设置为0)。每次从第一行中寻找到最小元素,将其第二行写入对应的排名。
程序:
#include <stdio.h>
void sort(int num[][100],int count); //形式参数,第一维可以省略
void main()
{
int num[2][100],count=0;
char ch;
//输入一串数据,输出相应的排名,不改变位置
printf("输入数字序列:(@表示结束)");
while((ch=getchar())!='@'&&count<=100) //初始化输入
{
if(ch!=' '&&ch!='\n')
{
num[0][count]=ch-'0';
num[1][count++]=0;
}
}
sort(num,count);
}
void sort(int num[][100],int count)
{
int i,j,k,min,rank=0,last=-32768;
//排序
for(i=0;i<count;i++)
{
j=0;
while(num[1][j]!=0) //寻找每一轮第一个未排名数的下标
j++;
min=j;
for(k=0;k<count;k++) //每一轮最小值
if(num[0][k]<num[0][min]&&num[1][k]==0)
min=k;
if(num[0][min]==last)
num[1][min]=rank;
else
num[1][min]=++rank;
last=num[0][min];
}
for(i=0;i<count;i++)
{
printf("%2d",num[1][i]);
}
printf("\n");
}
程序结果:
输入: