按结构体元素排序——更进一步(fishing_4)
接着前面的按结构体某一元素排序,前面是根据k从小到大进行排序,然后输出k以及对应的f、w。
现在要更进一步,
在k从小到大排序的前提下,再根据f从小到大进行排序;
再根据w从大到小进行排序;
最后,输出最小的k、“对应”最小的f、“对应”最大的w(注意,这里没有排序,只是输出最小的k、f、最大的w的那组数据)。
具体实现的代码如下(变量命名的有点随意了,= =):
代码核心就是,先把最小的k分出来,对f进行冒泡排序,然后把最小的f分出来,对w进行冒泡排序。
#include "stdio.h"
/***声明结构体***/
typedef struct //这里比直接struct recommand声明的好处就是,省去了struct recommand mid这样的声明。
{
float w;
int k;
int f;
}recommand;
#define numbers 11
void main(void)
{
int i;
int j;
int m;
int n;
int i1; //判断k的分界线
int t1 = 0; //最小的k的分界线
int t2 = 0; //最小的f的分界线
int a1;
int b1;
int c1;
int d1;
int e1;
int f1;
int g1;
recommand re[numbers]; //定义结构体数组re
recommand mid1; //定义用于交换传值的中间结构体mid
recommand mid2;
recommand mid3;
recommand *p = re; //定义结构体指针p,指向结构体数组re的首地址
/**初始化结构体数组**/
for(m = 0;m < numbers;m++)
{
re[m].w = 1 + m*1.0/10;
re[m].f = 1 + m;
re[m].k = 20 - m; //re[i].k = 20 - i
/**对其中一些元素进行修改,方便举例**/
re[1].f = 3;
re[1].k = 10;
re[2].k = 10;
re[3].k = 10;
re[3].f =3;
re[10].f = 4;
re[1].w = 1.5;
re[10].w = 1.4;
re[3].w = 1.7;
printf("第%d个结构体的信息为: w :%f k:%d f:%d \r\n", m, re[m].w, re[m].k, re[m].f);
}
/**排序**/
for(i = 1;i <= (numbers-1);i++) //注意这里的循环次数(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 从大到小排序
{
mid1 = *(p+j);
*(p+j) = *(p+j+1);
*(p+j+1)=mid1;
}
}
}
printf("\r\n按k从小到大排序,排序结果为:");
printf("\r\n");
//打印最后结果
for(n = 0;n < numbers;n++)
{
printf(" w:%f, k:%d, f:%d \r\n", (p+n)->w, (p+n)->k, (p+n)->f);
}
/**找出最小的k在哪儿分界,注意分界后的值有(t1)个**/
for(i1 = 0;i1 < numbers;i1++)
{
if((p+i1)->k < (p+i1+1)->k)
{
t1 = i1 + 1; //注意这里要+1,指针从0开始算的
break;
}
}
printf("\r\n t1的值为:%d\r\n",t1);
/**对k分解后的排序结果**/
for(a1 = 1;a1 <= (t1-1);a1++)
{
for(b1 = 0;b1 <= (t1 - a1 - 1);b1++)
{
if((p+b1)->f > (p+b1+1)->f)
{
mid2 = *(p+b1);
*(p+b1) = *(p+b1+1);
*(p+b1+1) = mid2;
}
}
}
printf("\r\n k分界后,按f从小到大排序的结果:\r\n");
for(c1 = 0;c1 < t1;c1++)
{
printf("w:%f, k:%d, f:%d \r\n",(p+c1)->w, (p+c1)->k, (p+c1)->f);
}
/**找出f在哪儿分界,注意分界后的值有(t2)个**/
for(g1 = 0;g1 < t1;g1++)
{
if((p+g1)->f < (p+g1+1)->f)
{
t2 = g1 + 1; //跟前同理
break;
}
}
printf("\r\n t2的值为:%d\r\n",t2);
for(d1 = 1;d1 <= (t2-1);d1++)
{
for(e1 = 0;e1 <= (t2-d1-1);e1++ )
{
if ((p+e1)->w < (p+e1+1)->w) //从大到小进行排序
{
mid3 = *(p+e1);
*(p+e1) = *(p+e1+1);
*(p+e1+1) = mid3;
}
}
}
printf("\r\n w分界后,按w从大到小排序的结果:\r\n");
for(f1 = 0;f1 < t2;f1++)
{
printf("w:%f, k:%d, f:%d \r\n",(p+f1)->w, (p+f1)->k, (p+f1)->f);
}
}
程序运行的结果如下:
上面数据的最后一组的第一个就是所求的目标值。
欢迎批评指正交流!