Рекурсия в Си - Пузырьковая сортировка? - PullRequest
1 голос
/ 09 марта 2011

Заранее извиняюсь за количество кода в конце, потому что есть немного, я оставлю это до последнего.Я читаю некоторые переменные в структуре, и я хочу изменить их порядок так, чтобы число, ближайшее к 0, было вверху (все они являются минус-значениями, поскольку они являются децибелами).Если я правильно помню свои вещи, я думаю, что я, возможно, сделал пузырьковую сортировку (или какую-то ужасную попытку). В любом случае, я решил, что мне нужно решить эту проблему с помощью рекурсии, я могу придумать 2 или 3 способа сделать это сможет быть, больше кода, но меньше головной боли, но я пошел, и это работает!

Тем не менее ... все отлично, но в конце у меня остался случайный дубликат .. У меня 10 узлов, узлов[0] узлам [9].Я намеренно объявляю все после и включая 5 как ноль просто как тест, который он остановит, если у него не будет полных 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 ]

5 голосов
/ 09 марта 2011

Вы выделили только 9 узлов, и вы используете 10. Это вполне может привести к проблемам.

1 голос
/ 09 марта 2011

1) Для количества предметов, которые вы используете, подойдет пузырьковая сортировка. Однако, если вам нужно отсортировать много вещей (например, еще на несколько порядков), вы можете переключиться на другой алгоритм сортировки. Пузырьковая сортировка в среднем равна O (n ^ 2). (источник: https://en.wikipedia.org/wiki/Bubble_sort#Performance)

2) Рекурсия обычно используется для алгоритмов сортировки в стиле «разделяй и властвуй», таких как QuickSort. Bubble Sort может быть легко реализован итеративно. (пример: https://en.wikipedia.org/wiki/Bubble_sort#Implementation)

3) Если вы используете это во встроенной системе со строгими ограничениями памяти, рекурсия может быть плохим выбором. Для рекурсии обычно требуется большой объем стека для поддержки вызовов вложенных функций, которые вы делаете. Вы можете исправить это с помощью хвостовой рекурсии, но вам нужно убедиться, что ваши рекурсивные функции написаны для поддержки этого. (пример хвостовой рекурсии: https://en.wikipedia.org/wiki/Tail_call#Example_programs)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...