社区
C语言
帖子详情
很急啊,简单问题
delphimm
2005-01-10 12:51:44
输入5个分数, 然后输出名次,分数越高,名次越低!
比如 5 4 6 7 8 输出 2 1 3 4 5
什么思路呢? 最好是效率最高?
...全文
383
33
打赏
收藏
很急啊,简单问题
输入5个分数, 然后输出名次,分数越高,名次越低! 比如 5 4 6 7 8 输出 2 1 3 4 5 什么思路呢? 最好是效率最高?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
深度学习入门与实践
学习了很多深度学习理论知识,却不知道如何具体编程实践?别
急
,本课程就手把手教你如何构建自己的深度学习应用。从经典的神经网络到时下流行的方法,即便是新手也可以快速入门。就让我们一起在人工智能的浪潮中,...
人工智能领域存在的
问题
框架
问题
(如何思考):机器遇到
问题
不知道用什么知识去解决
问题
,就是不知道如何思考,需要人为设定,比如人类和机器都没有学习过脑筋
急
转弯
问题
,然后给他们出一个脑筋
急
转弯的
问题
,机器就不知道用什么知识解决,...
《花雕学AI》21:ChatGPT能否应对脑筋
急
转弯?逻辑推理和创造性思维的大考验!
脑筋
急
转弯是一种智力游戏,可以锻炼我们的思维能力以及解决
问题
的能力。然而,对于许多人来说,脑筋
急
转弯也是一项相当具有挑战性的任务。在这个过程中,我们需要运用逻辑推理、上下文理解等能力才能解决
问题
。随着...
急
什么,这个时侯不能
急
!
记得有一次,写代码。...当时很着
急
,不知道出错在哪里了,我的老师看到这个情况,对我说:“
急
什么?别着
急
。这个时侯不能
急
!慢慢调试一下。越
急
越调试不出来。” 后来,我静下心来调试,终于把
问题
找到了。
这个很
简单
在制订计划时,我们很少有人指出任务中可能存在难题和风险,只要认为可执行,就觉得很
简单
。而在完成任务的过程中,出现了这样那样的
问题
,一个内存错误BUG可能花掉你一天时间,一个小
问题
可能让你陷入绝望,这时才...
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章