C中的递归 - 冒泡排序?

时间:2011-03-08 21:37:06

标签: c sorting recursion struct

预先为最后的代码量道歉,因为有一点我会把它留到最后。 我正在将一些变量读入结构中,并且我想重新排序这些变量,因此最接近0的数字位于顶部(它们都是负值,因为它们是分贝读数)。 如果我记得我的东西正确,我想我可能做了冒泡(或者一些可怕的尝试) 无论如何,我决定我应该通过递归来解决这个问题,我可以想到2或3种方法可以用更多的代码来解决这个问题,但不是很头疼但是我有一个去,它有效!

然而......一切都很完美,但我最后留下了一个随机副本。我有10个节点,节点[0]到节点[9]。我故意声明所有之后并且包括5为null只是作为一个测试,如果它没有完整的10个条目它将停止。 我的printf表明它停止了,但我最终将我的5个值之一复制到节点中[9]?

我很累,所以它可能会盯着我,但我真的无法理解这是怎么回事。任何提示/技巧将不胜感激。此外,任何有关不良做法的观察或提高我的代码效率的方法都不会令人不满!

不要担心硬编码值或全局变量,它是针对嵌入式设备的,并且结构将由另一个函数填充。此外,对于试图快速编译的任何人,我已将所有打印语句留在下面的代码中进行调试。

由于

#define MAX_NAME_SIZE 16
#define MAX_RSSI_SIZE 5

struct route_data
{
    char* ssid;

    int rssi;
};

struct route_data nodes[9];
struct route_data temp;


void main(){
nodes[0].ssid = "N1";
nodes[0].rssi = -20;
nodes[1].ssid = "N2";
nodes[1].rssi = -40;
nodes[2].ssid = "N3";
nodes[2].rssi = -34;
nodes[3].ssid = "N4";
nodes[3].rssi = -27;
nodes[4].ssid = "N5";
nodes[4].rssi = -80;

nodes[5].ssid = "NULL";
nodes[6].ssid = "NULL";
nodes[7].ssid = "NULL";
nodes[8].ssid = "NULL";
nodes[9].ssid = "NULL";

int y =0;

while(y!=10){
printf("Node[%d] -\n\t%s\t %d\n\n",y,nodes[y].ssid, nodes[y].rssi);
y++;
}

chooseBest(0,1);

y=0;

while(y!=10){
printf("Node[%d] -\n\t%s\t %d\n\n",y,nodes[y].ssid, nodes[y].rssi);
y++;
}

}

int chooseBest(int x, int i){

    //No point comparing the same values, increment up
    if(x==i){
    printf("X and I match - x %d\t i %d\n\n",x,i);
    i++;
    chooseBest(x,i);
    }
    //if X is less than I, and I is not null, check if i is greater than x and then swap
    else if((nodes[x].rssi<nodes[i].rssi)&&(nodes[i].rssi!=0)){
    printf("\nNode X Rssi %d\t Node I Rssi %d\n",nodes[x].rssi,nodes[i].rssi);
    printf("Node[X] is smaller than I - i %d\n",i);
    printf("X - %d\tI - %d\n\n",x,i);
        if(i>x){
            if(i!=0){
                temp.ssid = nodes[x].ssid;
                temp.rssi = nodes[x].rssi;

                nodes[x].ssid = nodes[i].ssid;
                nodes[x].rssi = nodes[i].rssi;

                nodes[i].ssid = temp.ssid;
                nodes[i].rssi = temp.rssi;
            }
        }
    i++;
    chooseBest(x,i);
    }
    //Is X greater than I and X is not null? If so, is X greater than I. Swap values
    else if((nodes[x].rssi>nodes[i].rssi)&&(nodes[x].rssi!=0)){
    printf("Node[X] is bigger\n");
    printf("X - %d\tI - %d\n\n",x,i);
        if(x>i)
        {
            temp.ssid = nodes[x].ssid;
            temp.rssi = nodes[x].rssi;

            nodes[x].ssid = nodes[i].ssid;
            nodes[x].rssi = nodes[i].rssi;

            nodes[i].ssid = temp.ssid;
            nodes[i].rssi = temp.rssi;

        }
    i++;
    chooseBest(x,i);
    }
    else{
        //If X is null we have traversed all values
        if(nodes[x].rssi==0){
            printf("Nodes[x] equals null\n");
            printf("X - %d\tI - %d\n\n",x,i);
        return 0;
        }
        //Otherwise, we have reached the end of I and need to increment X and reset I
        else{
        printf("About to increment X\n");
        printf("X - %d\tI - %d\n\n",x,i);
        x++;
        i=0;
        chooseBest(x,i);
        //printf("End of the line\n");
        }

    }

2 个答案:

答案 0 :(得分:5)

你只分配了9个节点,而你正在使用10.这很可能导致问题。

答案 1 :(得分:1)

1)对于您正在使用的项目数量,冒泡排序会很好。但是,如果您需要对很多事情进行排序(比如几个数量级),您可能需要切换到不同的排序算法。冒泡排序在平均情况下为O(n ^ 2)。 (来源:https://en.wikipedia.org/wiki/Bubble_sort#Performance

2)递归通常用于“分而治之”式排序算法,如QuickSort。冒泡排序可以很容易地迭代实现。 (例如:https://en.wikipedia.org/wiki/Bubble_sort#Implementation

3)如果您在具有严格内存限制的嵌入式系统上运行此操作,则递归可能是一个糟糕的选择。递归通常需要具有大的堆栈空间来支持您正在进行的嵌套函数调用。您可以使用尾递归来解决这个问题,但是您必须确保编写递归函数以支持它。 (尾递归的例子:https://en.wikipedia.org/wiki/Tail_call#Example_programs