很急啊,简单问题

delphimm 2005-01-10 12:51:44
输入5个分数, 然后输出名次,分数越高,名次越低!

比如 5 4 6 7 8 输出 2 1 3 4 5

什么思路呢? 最好是效率最高?
...全文
383 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenailin 2005-01-25
  • 打赏
  • 举报
回复
呵呵 !
排序啊 , 找数据结构书copy一段就OK了 !
qingyuan18 2005-01-25
  • 打赏
  • 举报
回复


void count(int a[],int n) /* n为输入的数的个数*/
{
int b{MAX] = {0};
int i,j;
int temp;
for(i =1;i<MAX;i++)
{
b[i-1] =i;
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
temp= b[i];
b[i] = b[j];
b[j] = temp;
}

}
}
for(i=0;i<n;i++)
{
printf("%d",b[i]);
}
}
pcboyxhy 2005-01-24
  • 打赏
  • 举报
回复
这个办法好
QuickKeyBoard 2005-01-24
  • 打赏
  • 举报
回复
如果你的整数都是小范围的数,(比如不过32767),可以考虑用空间换时间的方法。加个Hash就可以了,读入O(n), 建Hash O(n), 整理O(n), 输出O(n),全算上O(4n)完事。
我列出的程序考虑了并列的排名,比如:1 1 2得到的名次序列为1 1 3。

#include <stdio.h>
#include <stdlib.h>

#define N 10

int Hash[1000], data[N], Rank[1000];

void main()
{
int i;
long s;

setmem(Hash, 1000*sizeof(int), 0);
setmem(Rank, 1000*sizeof(int), 0);
randomize();
for ( i=0; i< N; i++)
data[i] = random(10)+1;
for ( i=0; i<N; i++)
Hash[data[i]]++;
for (s=0, i=0; i<1000; i++)
if (Hash[i])
{
if (s==0)
{
Rank[i] = 1;
s = Hash[i];
}
else
{
Rank[i] = s + 1;
s += Hash[i];
}
}

for ( i=0; i<N; i++)
printf("%d %d\n", data[i], Rank[data[i]]);
}
不知是否符合要求,请楼主指正...
xuelong_zl 2005-01-24
  • 打赏
  • 举报
回复
mark
ybt631 2005-01-23
  • 打赏
  • 举报
回复
还有一种更好的算法,代码如下:基本思想跟sleep说的差不多
typedef struct{
int data;
int LastPosi;
}AA;

void quicksort1(AA a[],int m,int n) //用其他时间复杂度为o(nlogn)的排序算法也可以
{
int i,j;
AA temp;
if(m>=n) return;
i=m;
j=n;
temp=a[i]; //以a[m]为枢轴
while(i<j)
{
while(temp.data<=a[j].data&&i<j)
j--;
a[i]=a[j];
while(temp.data>=a[i].data&&i<j)
i++;
a[j]=a[i];
}
a[i]=temp;
quicksort1(a,m,i-1);
quicksort1(a,i+1,n);
}
void mingci(int a[],int c[],int n)
{
int i,j;
AA *aa=new AA[n];
for(i=0;i<n;i++)
{aa[i].data=a[i]; aa[i].LastPosi=i;}
quicksort1(aa,0,n);//以data为关键字对结构体aa排序;
for(i=0;i<n;i++)
{
j=i;
while(aa[j].data==aa[j-1].data&&j>0)
j--;
c[aa[i].LastPosi]=c[aa[j-1].LastPosi]+1;
}
delete []aa;
}

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define N 4
#define MAX 7
main()
{
int a[N],c[N];
int i;
srand(time(NULL));
for(i=0;i<N;i++)
a[i]=rand()%MAX+1; //随机产生的数
for(i=0;i<N;i++)
printf("%6d",a[i]);
printf("\n");
mingci(a,c,N);
for(i=0;i<N;i++)
printf("%6d--%6d\n",a[i],c[i]);
printf("\n");
}
ybt631 2005-01-23
  • 打赏
  • 举报
回复
有点错误,c重复定义了,去掉定义项中的c[n]
ybt631 2005-01-23
  • 打赏
  • 举报
回复
用改进的记数排序更好!时间复杂度虽然仍然是O(n^2),但常数项小
void countsort2(int a[],int c[],int n)
{
//a记录分数,c记录每个分数的名次,即a[i]的名次是c[i]
int i,j,c[n];
for(i=0;i<n;i++)
c[i]=1;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j]) c[i]++;
else c[j]++;
}
wojiushiwo226547 2005-01-23
  • 打赏
  • 举报
回复
可不可以找一个通用的方法啊
我决的这方法好象不是很通用 啊 有局限性啊。。。////???
清泉ys 2005-01-11
  • 打赏
  • 举报
回复
我觉的这个问题就是数组的排序问题
szywelcome 2005-01-11
  • 打赏
  • 举报
回复
关键理解循环比较那块

# include "stdio.h"
struct AAA
{
int value;
int n;
};
void main()
{
int i;
int j;
AAA a[5];
for(i=0;i<5;i++)
{
scanf("%d\n",&a[i].value);
a[i].n =1;
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if (i!=j && a[i].value>a[j].value)
a[i].n++;

}
}

for (i=0;i<5;i++)
{
printf("%d %d\n",a[i].value,a[i].n);
}

}

3DO314li 2005-01-11
  • 打赏
  • 举报
回复
可以使用STL中的set,效率应该不错。
methuselah 2005-01-11
  • 打赏
  • 举报
回复
排遍序不可以吗?
Roaming_Sheep 2005-01-10
  • 打赏
  • 举报
回复
如果我有相同的两个数,想得到的名次也一样,但是希望名次可以挨着,即:
输入 1 1 2 2 3
输出 1 1 2 2 3
如何实现?各位指教。
————————————————
我写的算法可以,只要在填写排序后的位置的时候,改为填写排序后名次(允许相同值)即可

代码实现我不管
bjstcm 2005-01-10
  • 打赏
  • 举报
回复
如果我有相同的两个数,想得到的名次也一样,但是希望名次可以挨着,即:
输入 1 1 2 2 3
输出 1 1 2 2 3
如何实现?各位指教。
haichao0991 2005-01-10
  • 打赏
  • 举报
回复
大家好,我是一个初学者,有一个问题:
我和同学用的同一张VC安装盘,系统同是2000,结果他的VC里有ADO Data控件,可是我的却没有,这是为什么啊?我怎样才能插入ADO Data控件啊?
说具体点就是如何在下面步骤的结果中能填加ADO控件:
VC6.0/新建工程/Project/Add to Project/Components and Controls/打开Gallery/打开Registered ActiveX Controls
上面的文件夹里应该有Microsoft ADO Data Control这个控件的,可是我却没有,怎么回事事?
winstonch 2005-01-10
  • 打赏
  • 举报
回复
嗯我的算法是不对,谢谢 Roaming_Sheep(Roaming Sheep)
bjstcm 2005-01-10
  • 打赏
  • 举报
回复
晕,慢了,,算我上面的没说~~~
bjstcm 2005-01-10
  • 打赏
  • 举报
回复
我怎么感觉楼上的运算过程有些不对呢?
BlackEagle_ 2005-01-10
  • 打赏
  • 举报
回复
思路跟一楼的差不多,用一个结构体实现
struct AAA {
int value; //分数值
int n; //名次
};
void main() {
int i;
int j;
struct AAA a[5];

for(i = 0; i < 5; i++) {
scanf("%d", &a[i].value);
a[i].n = 1;
}

for(i = 0; i < 5; i++) {
for(j = 0; j < 5; j++) {
if(i != j && a[i].value > a[j].value)
a[i].n++;
}
}

for(i = 0; i < 5; i++) {
printf("%d %d\n", a[i].value, a[i].n);
}
}

====================================
输入:
5
4
6
7
8
输出:
5 2
4 1
6 3
7 4
8 5
加载更多回复(13)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧