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

将一个8位的数组排序,将其下标(注意是下标哦)按排好的顺序储存在另一个数组当中(用c或者vb)
例如
有这样一个8位数组
int cj[7];
//例如cj[0]=12;cj[1]=2;cj[2]=31;cj[3]=231;cj[4]=0;cj[5]=123;cj[6]=679;cj[7]=790
要求将其按大小排序
//如上则为:cj[7]>cj[6]>cj[3]>cj[5]>cj[2]>cj[0]>cj[1]>cj[4];
然后将排好的序号赋值给一个新的数组 int px[7]
//如上则px[0]~px[7]的值分别为:7 6 3 5 2 0 1 4。

思路:在数值进行排序时,下标也同时移动。这就要求二者要联动。为此创建一个PAIR结构体,将此二者关联在一起。用库里的快排函数qsort可以省略排序的麻烦,并指定qsort按PAIR中数值大小为标准排序结构体数组,这样排序结果中的结构体数组下标和值还是保持开始时的对应关系。

#include<STDIO.H>
#include<string.h>
#include<stdlib.h>
#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<N;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("\n排好序的整数为:");
for (i=0;i<N;i++)
{
printf("%d ",a[i].cj);
cj[i]=a[i].cj;
}
printf("\n对应原来的下标:");
for (i=0;i<N;i++)
{
printf("%d ",a[i].px);
px[i] = a[i].px;
}
putchar('\n');
return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-12
经典的办法,是依次取cj的数据做关键字,依次插入px数组。
比较简单的办法,从cj数组中取最大值,得到序号,写入px数据的第一个位置,然后,清除对应的cj的数据,或者说给它赋一个最小的可能值。然后,第二次,依然取最大值。。。这种做法比较次数较多,但没有数据的移动。缺点是会丢失cj的原始数据,这个可以通过复制一个cj数组来解决。
第2个回答  推荐于2017-12-16
#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");
}本回答被网友采纳
第3个回答  2013-05-12
#include<stdio.h>
#include<malloc.h>
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<n;i++)
p[i]=i;
for(i=0;i<n;i++)
for(int j=0;j<n;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");
}
第4个回答  2013-05-12
1686095542
相似回答