C中的动态数组升序排序

时间:2013-03-18 12:11:37

标签: c arrays dynamic

我正在尝试对动态数组列表进行排序,但它不起作用,我不明白我应该怎么做。这就是我到目前为止所做的:

    void ascending_sort(Controller* ctrl)
    {
    int i,j;
    Cost* aux;
    DynamicVector* c=getAllCosts(ctrl);
    for(i=0;i<getLen(c)-1;i++)
    {
        Cost* cost;
        for(j=i+1;j<getLen(c);j++)
        {
            if(cost[i].sum < cost[j].sum)
            {
                    aux=cost[i]; //error
                cost[i]=cost[j];
                cost[j]=aux; //error
            }
        }
    }
}

这是结构:

typedef struct{
    char* day;
    char* type;
    int sum;
}Cost;

我该如何解决?当我宣布“Cost * aux”时,我想我做错了什么。我希望你能帮助我!

编辑:我更新了排序功能的新代码。现在它不打印我想要的东西。它打印'成本1',没有别的,然后我收到一个停止一切的“结束程序”窗口。可能是什么问题?

这是新的排序算法:

void ascending_sort(Controller* ctrl)
        {
        int i,j;
        DynamicVector* c=getAllCosts(ctrl);
        for(i=0;i<getLen(c)-1;i++)
        {
            Cost* cost=getElementAtPosition(c,i); //returns element on position
            for(j=i+1;j<getLen(c);j++)
            {
                if(cost[i].sum < cost[j].sum)
                {
                const Cost  aux=cost[i];
                            cost[i]=cost[j];
                            cost[j]=aux;
                }
            }
        }
    }

这是打印功能://此功能在控制台中

void PrintCosts(Console* console)
{
    DynamicVector* CostList=getAllCosts(console->ctrl);
    if (getLen(CostList))
    {
        int i;
        for(i=0;i<getLen(CostList);i++)
        {
            printf("\nCost %d\n\n",i+1);
            Cost *c=(Cost*)getElementAtPosition(CostList,i);
            PrintCost(c);
        }

    }
    else printf("No cost in the list!");
}

这是从控制器到控制台调用sort函数的函数:

void AscendingSort(Console* console)
{
    ascending_sort(console->ctrl);
}

3 个答案:

答案 0 :(得分:2)

是的,当您需要实际值时,您正在使用指向Cost的指针。这是最里面的范围应该是什么:

const Cost aux = cost[i];
cost[i] = cost[j];
cost[j] = aux;

请注意,我没有看到(或理解)costCost数组和c数组DynamicVector *之间的关系,你在循环中使用的长度。

另外,你的排序算法并不是很好;你应该使用qsort()

答案 1 :(得分:1)

Cost*使用Cost代替aux

答案 2 :(得分:0)

修订后的排序代码更好,但可能做出了无根据的假设:

void ascending_sort(Controller* ctrl)
{
    DynamicVector *c = getAllCosts(ctrl);
    for (int i = 0; i < getLen(c)-1; i++)
    {
        Cost *cost = getElementAtPosition(c,i);
        for (int j = i+1; j < getLen(c); j++)
        {
            if (cost[i].sum < cost[j].sum)
            {
                const Cost aux = cost[i];
                cost[i] = cost[j];
                cost[j] = aux;
            }
        }
    }
}

如果您需要使用getElementAtPosition(c, i),则需要使用getElementAtPosition(c, j)来获取第二个值。这对我来说似乎没有争议。

此外,如果您需要函数来获取值,您可能还需要一个函数来放置值。

void ascending_sort(Controller* ctrl)
{
    DynamicVector *c = getAllCosts(ctrl);
    for (int i = 0; i < getLen(c)-1; i++)
    {
        Cost *cost_i = getElementAtPosition(c, i);
        for (int j = i+1; j < getLen(c); j++)
        {
            Cost *cost_j = getElementAtPosition(c, j);
            if (cost_i->sum < cost_j->sum)
                swapElements(c, i, j);
        }
    }
}

或者,也许:

void ascending_sort(Controller* ctrl)
{
    DynamicVector *c = getAllCosts(ctrl);
    for (int i = 0; i < getLen(c)-1; i++)
    {
        Cost *cost_i = getElementAtPosition(c, i);
        for (int j = i+1; j < getLen(c); j++)
        {
            Cost *cost_j = getElementAtPosition(c, j);
            if (cost_i->sum < cost_j->sum)
            {
                setElementAtPosition(c, i, cost_j);
                setElementAtPosition(c, j, cost_i);
            }
        }
    }
}