[c++] sort. leksykokraficzne, nie działa do końca prawidłowo

0

Chciałem napisać sortowanie leksykograficzne oparte na quicksorcie, ale nie działa ono do konca prawidłowo. Szukam błędu ale nie mogę znaleźć.

std::map<char, int> sign;
        sign['A'] = 1; sign['a'] = 1;
        sign['Ą'] = 2; sign['ą'] = 2;
        sign['B'] = 3; sign['b'] = 3;
        sign['C'] = 4; sign['c'] = 4;
        sign['Ć'] = 5; sign['ć'] = 5;
        sign['D'] = 6; sign['d'] = 6;
        sign['E'] = 7; sign['e'] = 7;
        sign['Ę'] = 8; sign['ę'] = 8;
        sign['F'] = 9; sign['f'] = 9;
        sign['G'] = 10; sign['g'] = 10;
        sign['H'] = 11; sign['h'] = 11;
        sign['I'] = 12; sign['i'] = 12;
        sign['J'] = 13; sign['j'] = 13;
        sign['K'] = 14; sign['k'] = 14;
        sign['L'] = 15; sign['l'] = 15;
        sign['Ł'] = 16; sign['ł'] = 16;
        sign['M'] = 17; sign['m'] = 17;
        sign['N'] = 18; sign['n'] = 18;
        sign['Ń'] = 19; sign['ń'] = 19;
        sign['O'] = 20; sign['o'] = 20;
        sign['Ó'] = 21; sign['ó'] = 21;
        sign['P'] = 22; sign['p'] = 22;
        sign['Q'] = 23; sign['q'] = 23;
        sign['R'] = 24; sign['r'] = 24;
        sign['S'] = 25; sign['s'] = 25;
        sign['Ś'] = 26; sign['ś'] = 26;
        sign['T'] = 27; sign['t'] = 27;
        sign['U'] = 28; sign['u'] = 28;
        sign['V'] = 29; sign['v'] = 29;
        sign['W'] = 30; sign['e'] = 30;
        sign['X'] = 31; sign['x'] = 31;
        sign['Y'] = 32; sign['y'] = 32;
        sign['Z'] = 33; sign['z'] = 33;
        sign['Ż'] = 34; sign['ż'] = 34;
        sign['Ź'] = 35; sign['ź'] = 35;

int cmpWord(String a, String b) {
        //1  = a>b
        //0  = a=b
        //-1 = a<b

        int l[2];
        int i, k;
        l[0] = a.Length();
        l[1] = b.Length();

        k = 0;
        if(l[1]>l[0])
                k = 1;

        for(int i = 0; i < l[k]; i++) {
                char z1, z2;
                z1 = a[i+1];
                z2 = b[i+1];
                if(sign[z1] < sign[z2]) {
                        return 1;
                } else if(sign[z1] > sign[z2]) {
                        return -1;
                } else if(sign[z1] == sign[z2] && i == l[k]) {
                        return 0;
                }
        }

        return 0;
}

int quickSort(int left, int right) {
        int i=left;
        int j=right;
        String x = this->rankVector[(left+right)/2]->getName();
        do {
                while(this->cmpWord(x, this->rankVector[i]->getName())) i++;
                while(this->cmpWord(this->rankVector[i]->getName(), x)) j--;
                if(i<=j) {
                        rank* temp = this->rankVector[i];
                        this->rankVector[i] = this->rankVector[j];
                        this->rankVector[j] = temp;
                        i++;
                        j--;
                }
        }while(i<=j);
        if(left<j) quickSort(left, j);
        if(right>i) quickSort(i, right);

        return 0;
}
</b>
0

A nie lepiej do tego użyć RadixSorta?

0

może i lepiej, ale trzeba wiedzieć najpierw że coś takiego istnieje i wiedzieć jak to działa (pierwsze strony googli mówią niewiele)

1 użytkowników online, w tym zalogowanych: 0, gości: 1