想请各位看看这样的选择排序有问题吗?

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资源(处理时间)和内存资源(变量占用空间) 之间权衡。