Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

 Użytkownik
	

Witam
Caly dzien sie mecze z tym sortowaniem
narazie udalo mi sie posortowac po dlugosci, zostalo mi jeszcze posortowac te stringi alfabetycznie ale jak?
Bawilem sie ze 100 razy if'ami , for'ami i nie moge nic z tym zrobić.
Prosze chociażby o sugestie , przykład 
moj program :
#include <iostream>
#include <string>
using namespace std;
int main()
{
char litery[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x',
'y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
};
int w,n;
int i=0;
string lancuch[150];
scanf("%d",&n);
while(i<n)
    cin >> lancuch[i++];
for(w=1;w<200;w++)
    for(i=0;i<150;i++)
            if(lancuch[i].length()==w)
                    cout << lancuch[i] <<endl;
return 0;
}
Offline



 Moderator
	



Możesz spróbowąc sortować bąbelkowo, przy pomocy takiej procedurki:
void sort(char chrArray[], int intSize)     //intSize jest wielkością tablicy
    {
        int war;        //zmienna odpowiedzialna za okreslenie prawdziwosci warunku 
        int i;        //licznik petli for
        int k;        //licznik petli do while
        char chrMem;        //zmienna pomocnicza do przechowania wartosci komorki    tablicy
        
        
        do 
            {
                war=0;                
                for(i=0;i<intSize-1;i++)
                    {
                        k=i+1;
                        if (chrArray[k]<chrArray[i])
                            {
                                chrMem=chrArray[i];
                                chrArray[i]=chrArray[k];
                                chrArray[k]=chrMem;
                                war=1;
                             }
                     }
             }
        while (war!=0);
     }        //end of procedure sortI wywołać ją w mainie poprzez:
sort(litery,intSize)
P.S. Jeszcze że tak zgłupa spytam. Chcesz posortwać tablice litery[] i wstawić ją do tablicy lancuch[], czy jak?
P.P.S. Z góry sorki za jakąś pomyłkę - nie programowałem nic od roku ;-)
Offline

 Użytkownik
	

z stdin musze linijki posortowac wg. dlugosci a nastepnie uporzadkowac alfabetycznie ...
Offline

 Członek DUG
	

bleee sortowanie babelkowe sie do niczego nie nadaje, jest nieedukacyje i posiada duza zlozonosc.
Duzo lepiej jest zaimplementowac sobie quicksorta badz uzyc juz gotowego. funkcja qsort znajduje sie w cstdlib. Pozostaje tylko stworzenie funkcji porownujacej co nie stanowi chyba problemu.
Offline

 Użytkownik
	

Każdy rodzaj sortowania ma swoje zastosowanie. Co więcej quicksort nie zawsze jest szybszy od sortowania bąbelkowego. Dla kilku rekordów nie warto tracić zbyt dużo czasu na implementacje imho.
Offline

 Członek DUG
	

Zawsze mozna uzyc gotowego qsorta.
Offline


 Członek DUG
	
 Członek DUG
	

ja bym użył  <algorithm.h> i sringów z c++
no i wyglądałoby to tak:
string naszeStringi[1000]; /* *** */ sort(naszeStringi, naszeStringi+1000);
jako, że operatory <  > == dla stringów już są przeładowane (mowa o cpp) - nie ma problemu :-)
a jeśli chcesz posortować to dowolnym algorytmem - to pamiętaj, w cpp dla stringów już zdefiniowano czym jest < a czym > :)
Offline

 Użytkownik
	

Z liczbami bym pewnie sobie poradził ale nie mam już pojęcia jak uporządkować alfabetycznie. Moze ktoś napisze jakiś kawałeczek kodu?
Zakładając ze mam posortowaną tablice wg. dlugosci stringów o nazwie poukladane;)
aha ilosc stringow w tablicy to zmienna ile
Prosze Was o pomoc.
Chodzi mi caly czas o uporzadkowanie leksykograficzne.
Offline




 Moderator Mamut
	pisac kodu mi sie nie chce ale mozna podejsc do tego tak:
1. piszemy sortowanie (sortujemy po pierwszej, w nastepnym obiegu gdy pierwsze sie powtarzaja po drugiej itd.
2. piszemy funkcje porownujaca dla zaproponowanego qsorta porownujemy kolejne znaki
warto zaznaczyc ze wystarczy porownywac kody ascii jako liczby bez dodatkowych komplikacji (litery w ascii sa po koleji) ...
Offline

 Użytkownik
	

Zrobiłem na bąbelkowym - śmiga aż miło :)
jakby ktoś miał problem z sortowanie to polecam http://www.i-lo.tarnow.pl/edu/inf/alg/algsort/pages/006.php
Dzięki panowie, duże e-piwo stawiam!
Offline
 Członek DUG
	
narazie udalo mi sie posortowac po dlugosci, zostalo mi jeszcze posortowac te stringi alfabetycznie ale jak?
czyzby zadanie sor z oig?:D

Offline

 Użytkownik
	
 Członek DUG
	
Nie, ale widzialem tresci zadan. (Ladnie to tak szukac pomocy:D? )
Teraz jak juz sie zakonczylo to moge napisac:D
To zadanie pierwsze powinienes sortowac alfabetycznie, pozniej po dlugosci.
Mozna by to napisac mniej wiecej tak
#include <cstdio>
#include <cstring>
using namespace std;
const int max_line = 150;
const int max_length = 200;
void sort_leksy(char * * adr, int n);
void sort_len(char * * adr, int n);
main()
{
    static char znaki[max_line][max_length + 1];
    char * adr[max_line];
    int n, i;
    scanf("%i", &n);
    for(i = 0; i < n; i++)
    {
        scanf("%s", znaki[i]);
        adr[i] = znaki[i];
    }
    sort_leksy(adr, n);
    sort_len(adr, n);
    for(i = 0; i < n; i++)
    {
        printf("%sn", adr[i]);
    }
}
void sort_len(char * * adr, int n)
{
    int tab[max_line];
    int     i,
        j,
        tmp,
        str_len;
    char * tmp_adr;
    
    bool sort = true;
    for(i = 0; i < n; i++)
    {
        j = 0;
        while( adr[i][j++] != ' ')
            ;
        tab[i] = j - 1;
    }
    while(sort)
    {
        sort = false;
        for(i = n - 1; i > 0; i--)
        {
            if(tab[i] < tab[i - 1])
            {
                tmp = tab[i];
                tab[i] = tab[i - 1];
                tab[i - 1] = tmp;
                tmp_adr = adr[i];
                adr[i] = adr[i - 1];
                adr[i - 1] = tmp_adr;
                
                sort = true;
            }
        }
    }
}
void sort_leksy(char * * adr, int n)
{
    char * tmp;
    int     kmax,
        i,
        j;
    for(i = 0; i < n-1; i++)
    {
        kmax = i;
        for(j = i + 1; j < n; j++)
        {
            if(strcmp(adr[kmax], adr[j]) > 0)
            {
                kmax = j;
            }
        }
        tmp = adr[kmax];
        adr[kmax] = adr[i];
        adr[i] = tmp;
    }
}Dalo by sie pewnie jeszcze bardziej optymalnie, ale nie chce mi sie bawic:D

Offline