[英]Recursion in C - Bubble sort?
最后对代码量表示歉意,因为有一点我将保留到最后。 我正在将一些变量读取到结构中,并且我想对它们进行重新排序,以便最接近0的数字在顶部(它们都是负值,因为它们是分贝读数)。 如果我没记错的话,我想我可能已经做了冒泡的排序(或进行了一些恐怖的尝试),我决定应该递归地解决这个问题,我可以想到2或3种方法来解决这个问题也许更多的代码,但不那么麻烦,但我努力了,而且行得通!
但是...一切都进行得很好,但是最后我得到了一个随机重复。.我有10个节点,从nodes [0]到nodes [9]。 我特意声明5之后(包括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");
}
}
您仅分配了9个节点,而您正在使用10个。这很可能会导致问题。
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 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.