void price_dish(SqList *L)
{
int i,j,t,min,b;
double a;
char q[20],w[10];
SqList *p=L;
for (i=0;i<p->length-1;i++){
min=i;
for (j=i+1;j<p->length;j++)
if (p->data[j].dishprice<p->data[min].dishprice){
min=j;
t=p->data[min].dishnumber;
strcpy(q,p->data[min].dishname);
strcpy(w,p->data[min].style);
a=p->data[min].dishprice;
b=p->data[min].salequantity;
p->data[min].dishnumber=p->data[i].dishnumber;
strcpy(p->data[min].dishname,p->data[i].dishname);
strcpy(p->data[min].style,p->data[i].style);
p->data[min].dishprice=p->data[i].dishprice;
p->data[min].salequantity=p->data[i].salequantity;
p->data[i].dishnumber=t;
strcpy(p->data[i].dishname,q);
strcpy(p->data[i].style,w);
p->data[i].dishprice=a;
p->data[i].salequantity=b;
}
}
printf("最新价格由低到高排行榜为:\n");
DispListS_dish(sq);
}
但输出的结果是这样的:
你如果用简单一点的数据集测试呢? 例如只有 3 个菜。 看看结果如何。
其实可以试一下快速排序 ,系统自带的sort或者stable_sort,这样更好,不会有错。至于字典序的话,写一个自定义比较函数就可以了。
如果有用的话,就采纳吧。qaq
你的排序方法太繁琐——操作太多,特别是循环内部进行大量的不必要的数据操作,这在代码中是一大禁忌——影响代码效率。
其实你的问题就是一个记录排序,如果使用数据来源于数据库,则直接使用数据库操作函数对数据(缓存)进行排序即可。
而若数据并非来自数据库,则根据你的写法,并不需要进行大量的复制操作,只要按如下方法操作即可:
1.创建新数组,并从源数据提取[价格]及[ID]字段,增加排序字段——即新数组中仅包含三列数据:[序号]、[ID]、[价格]。
2.然后对新数组按[价格]排序,这里的排序方法可根据实际需要选择排方法,如最基础的冒泡排序。
3.最后,根据新数组的顺序,按新数组中的[ID]逐条输出源数据记录即可。
这是一种间接排序法。
提示:不管使用何种排序方法,主要是在CPU资源(处理时间)和内存资源(变量占用空间) 之间权衡。