Dementuje: post @moolchass jest bzdurą. On po prostu nie zrozumiał treści.
Zadanie nie jest wcale takie trywialne. Jedyne co mi w tej chwili przychodzi na myśl to kosztowne (:P) pamięciowo i trochę nieeleganckie rozwiązanie:
tworzymy 26-elementową tablicę intów indeksowaną literami alfabetu (albo i nie, to bez większego znaczenia, wtedy wystarczy odejmować od licznika pętli 'a'). Wczytujemy od użytkownika od której litery mamy "rozpoczynać alfabet" i przypisujemy wtedy odpowiednie wagi literom. Mniej więcej w taki sposób:
void ustalWagi(char od_ktorej,int* tablica)
{
int waga = 0;
for(char c = od_ktorej;l<'z';l++)
tablica[c]=waga++;
for(char c = 'a';l<od_ktorej;l++)
tablica[c]=waga++;
}
W ten sposób literki uzyskają odpowiednie "wagi" wg załozeń zadania.
Następnie tworzymy sobie metodę porównującą dwa znaki char korzystajac z naszej tablicy
bool mniejsze(char pierwszy, char drugi,int* tablica)
{
return tablica[pierwszy]<tablica[drugi];
}
Która odpowiada na pytanie czy pierwszy argument jest mniejszy (wg naszego alfabetu) od drugiego.
No i mając tą funkcję mozemy juz zaimplementować w zasadzie każde sortowanie, bo umiemy porównywać znaki char wg naszego nowego alfabetu.
EDIT:
jestem głupi :P istnieje rozwiązanie o wiele łatwiejsze ;)
Do porównywania znaków wystarczy nam użyć
znak%litera.
czyli:
bool mniejsze(char pierwszy, char drugi,char poczatek_alfa) //pierwsza litera porównywana, druga litera porównywana i pierwsza litera nowego alfabetu
{
return (pierwszy%poczatek_alfa)<(drugi%poczatek_alfa)
}