按结构体某一元素排序的小程序(fishing_3)
最近遇到,要排序选最优的问题,有11组3类属性【a,b,c】的数据,需要在11个b中选出最小的b,并输出对应的a,c。因为都是数,之前我是打算用数组来做,声明3个数组,然后对其中一个进行排序,然后选出索引对应的其他数组,但感觉没思路,觉得可能用结构体数组可能会简便些,至少看起来没那么多的数组看着烦,最后写出来了,一些需要注意的点在程序的注释部分都写了。做的测试源代码如下:
#include "stdio.h"
/***声明结构体***/
typedef struct //这里比直接struct recommand声明的好处就是,省去了struct recommand mid这样的声明。
{
float w;
int k;
int f;
}recommand;
void main(void)
{
int i;
int j;
int v;
#define numbers 11 //结构体数组大小,方便移植
recommand re[numbers]; //定义结构体数组re
recommand mid; //定义用于交换传值的中间结构体mid
recommand *p = re; //定义结构体指针p,指向结构体数组re的首地址
/**初始化结构体数组**/
for(i = 0;i < numbers;i++)
{
re[i].w = 1 + i*1.0/10; //这里要注意下,浮点数和整数的一些转换,我在这里就弄错过
re[i].f = 1 + i;
re[i].k = 20 -i;
printf("第%d个结构体的信息为: w :%f k:%d f:%d \r\n", i, re[i].w, re[i].k, re[i].f);
}
/**排序**/
for(i = 1;i <= (numbers-1);i++) //注意这里的循环次数
{
for(j = 0;j <= (numbers - i -1);j++) //注意这里的循环次数
{
if((p+j)->k > (p+j+1)->k) //从小到大排序 //(p+j)->k < (p+j+1)->k 从大到小排序
{
mid = *(p+j);
*(p+j) = *(p+j+1);
*(p+j+1)=mid;
}
}
}
printf("\r\n按k从小到大排序,排序结果为:");
printf("\r\n");
//打印最后结果
for(v = 0;v < numbers;v++)
{
printf(" w:%f, k:%d, f:%d \r\n", (p+v)->w, (p+v)->k, (p+v)->f);
}
}
程序的结果如下:
参考的资料:
https://blog.****.net/****17355456893/article/details/77607340
欢迎批评指正交流!