永发信息网

c语言,数组排序,返回序号

答案:5  悬赏:30  手机版
解决时间 2021-03-21 04:33
c语言,数组排序,返回序号
最佳答案
思路:在数值进行排序时,下标也同时移动。这就要求二者要联动。为此创建一个PAIR结构体,将此二者关联在一起。用库里的快排函数qsort可以省略排序的麻烦,并指定qsort按PAIR中数值大小为标准排序结构体数组,这样排序结果中的结构体数组下标和值还是保持开始时的对应关系。
#include
#include
#include
#define N 8
typedef struct
{
int cj;//数值
int px;//下标
}PAIR;
//qsort的辅助比较函数
int compare(const void *p, const void *q)
{
PAIR t1= *(PAIR* )p;
PAIR t2= *(PAIR* )q;
return(t1.cj>t2.cj);
}
int main()
{
PAIR a[N]={};
int cj[N]={};
int px[N]={};
printf("请输入%d个整数:", N);
for (int i=0;i{
scanf("%d",&(a[i].cj));
a[i].px=i+1;
//数组
cj[i] = a[i].cj;
px[i] = a[i].px;
}
qsort((void *)a,N, sizeof(PAIR), compare);
printf("
排好序的整数为:");
for (i=0;i{
printf("%d ",a[i].cj);
cj[i]=a[i].cj;
}
printf("
对应原来的下标:");
for (i=0;i{
printf("%d ",a[i].px);
px[i] = a[i].px;
}
putchar("
");
return 0;
}
全部回答
1686095542
#include
#include
int px[8]={0};
void sortindex(int a[],int n)
{
int *p;
int temp;
p=(int*)malloc(sizeof(int)*n);
for(int i=0;i p[i]=i;
for(i=0;i for(int j=0;j if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
for(i=0;i<8;i++)
px[8-i-1]=p[i];
free(p);
}
void main()
{
int cj[8]={12,2,31,231,0,123,679,790};
for(int i=0;i<8;i++)
printf("%d\t",cj[i]);
printf("\n");
sortindex(cj,8);
for(i=0;i<8;i++)
printf("%d\t",px[i]);
printf("\n");
}
经典的办法,是依次取cj的数据做关键字,依次插入px数组。
比较简单的办法,从cj数组中取最大值,得到序号,写入px数据的第一个位置,然后,清除对应的cj的数据,或者说给它赋一个最小的可能值。然后,第二次,依然取最大值。。。这种做法比较次数较多,但没有数据的移动。缺点是会丢失cj的原始数据,这个可以通过复制一个cj数组来解决。
#include "stdio.h"
void main()
{
int cj[8],px[8],temp[8],m;
for (int i=0;i<8;i++)
{
scanf("%d",cj+i);
temp[i] = cj[i];
px[i] = i;
}
int iMax,vMax;
for (i=0;i<8;i++)
{
iMax = i;
vMax = temp[i];
for (int j=i;j<8;j++)
{
if (temp[j]>vMax)
{
iMax = j;
vMax = temp[j];
}
}
m = temp[i];
temp[i] = temp[iMax];
temp[iMax] = m;
m = px[i];
px[i] = px[iMax];
px[iMax] = m;
}
for (i=0;i<8;i++)
{
printf("%d ",temp[i]);
}
printf("\n");
for (i=0;i<8;i++)
{
printf("%d ",px[i]);
}
printf("\n");
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
有线路由器设置好之前应该有哪些灯亮啊?就是
环村公路/新化快速(路口)地址有知道的么?有
单选题日本是一个受季风影响很大的岛国,地震
有在丰县龙龙食品厂上班的吗?我明天就要去那
成语嘘寒问暖的意思,与其守在她身边每天嘘寒
现在好羡慕上过大学的,我没有上过,我会后悔
2015劳动法关于外包工
怎么用混沌理论设计程序
同一个女孩好几次送给我手环这是什么意思
单选题我们要尽力防止带着个人偏见和不良的感
山东省的胶州市和日照市哪个发展的比较快
如何当好老师,中职院校教师资格证怎么考 10分
中国移动桥缘指定专营店地址在什么地方,想过
招聘出纳员,问什么问题能看得出应聘者是否符
sqlmap扫描到的sql注入,怎样解决
推荐资讯
非智能手机如何看电影?
啤酒花有什么用,生活小妙招,啤酒有何妙用
怎么改水印相机时间,水印相机星期几怎么改
乐成国际-停车场我想知道这个在什么地方
我的新速腾变速箱坏了,为什么一个月都没有修
兴湘楼地址在哪,我要去那里办事
青花瓷值多少钱一个
门头房正冲十字路口 (在路口的西北方 门口冲
常熟到顾山的车在哪里坐?多少钱?
这属于盗版权吗?
朋友给我从国外买的一部iPhone5S 并且我有购
已知点B(3,4)在直线y=-2x+b上,试判断点P
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?