[ dejan_su @ 02.12.2004. 15:17 ] @
Pokusavam da napravim jedan programcic, ali nikako da skontam nesto. Dakle napravim da upise 30 miliona proizvoljnih elemenata u fajl, ali kako to posle da ucitam u memoriju i da sortiram?

Postovao sam i fajl, ako neko zeli da vidi...ima mozda nesto nebitno ali ajde...ako neko zna molim za pomoc!
[ Srki_82 @ 02.12.2004. 15:47 ] @
Posto su ti elementi tipa int znaci da ti za svaki element treba po 4 bajta. 30000000 elemenata = 114.44 Mb. Koliko se secam mozes da alociras oko 4Gb memorije tako da 114.44Mb ne bi trebalo da bude problem ako naravno imas dovoljno memorije. Alociras memoriju, ucitas podatke... roknes quicksort i vratis podatke u fajl. Nista tesko. Ako imas neko memorijsko ogranicenje onda... pffff... ne znam.
[ Damjan S. Vujnovic @ 02.12.2004. 15:51 ] @
Posto su elementi manji od 65536 treba koristiti neki "linear-time" algoritam za sortiranje, tipa count sort i za to ce biti dovoljno svega 256 KB memorije...

Damjan S. Vujnovic
[ dejan_su @ 02.12.2004. 16:20 ] @
Meni je problem sto ne znam kako iz fajla da ucitam. Moram sve preko pointera da radim posto ih ima puno, ali ne znam kako to...
[ Milos Stojanovic @ 02.12.2004. 16:31 ] @
Iz fajla? Pa lako. Jedan od načina:

Code:
#include <stdio.h>

int *niz;
long int n; // broj elemenata, long za svaki slucaj, treba nam 32 bita za 30 miliona

void ucitajNizIzFajla(char* imeFajla)
{
     FILE* in;
     int i;
     in = fopen(imeFajla, "r");
     fscanf(in, "%d", &n); // ucitava broj elemenata
     // ako je broj elemenata fiksan, onda samo stavi
     // n = brojElemenata umesto ovog

     niz = (int*)malloc(sizeof(int)*n); // alocira niz od n brojeva

     for(i=0; i<n; i++)
     {
          fscanf(in, "%d", &(niz[i])); // ucitava i-ti broj iz fajla
     }
}
[ Damjan S. Vujnovic @ 02.12.2004. 16:43 ] @
'Ajmo jos jednom, za one sa jeftinijim ulaznicama...

Dakle, instanciras (bilo staticki, bilo dinamicki, zavisno od okruzenja) niz od 65536 long-ova koji inicijalizujes nulama. Citas elemente fajla redom i kako koji ucitas inkrementiras element na njegovoj poziciji u instanciranom nizu longova (iliti brojis pojavljivanje svakog od 65536 mogucih int-ova). Kad procitas sve elemente, krenes lepo po napravljenom nizu, otvoris novi fajl i upisujes po onoliko elemenata koliko si prebrojao.

Nema nikakve potrebe za drzanjem svih elemenata u memoriji, quick sort-om i slicno...

Hev fan,
Damjan S. Vujnovic
[ Milos Stojanovic @ 02.12.2004. 17:20 ] @
my bad, nisam ni video source zakačen uz pitanje. Ako čoveku treba da učita ceo niz u memoriju, onda što mu ne bi objasnili kako da to uradi? Druga stvar, iz nekog razloga koristi strukture, možda kasnije planira da tu strukturu prošiti nekim drugim podacima. Onda count sort neće moći. Za početak, učitavanje, ako ćemo C++ (pišem napamet, moguće da ima nekih syntax errora):

Code:
NIZOVI* niz;
void izFajla()
{
     ifstream infile("sort.txt");
     niz = new NIZOVI[30000000];

     for(long int i=0; i<30000000; i++)
     {
          infile >> niz[i].x;
          cout << niz[i].x;
     }
}
[ dejan_su @ 02.12.2004. 18:40 ] @
Trooper, uradio sam kao sto si napisao ali nista se ne desava, pokrenem lepo iz command prompta i on nista, samo mi opet izbaci prompt, ko da sam enter udario. Isto je radilo i ono iz mog koda. No ajde da vidimo sa sortiranjem, mozda cemo tamo uspeti da sredimo nesto. Koje parametre predajem funkciji za sortiranje? Sta mi je niz, a sta velicina? I da li predajem "obicno" ili kao referencu ili pointer?
Ako ne uspe, onda cu da probam sa onim kodom sto si prvo napisao. Bice nesto:)

Ako je bitno, ShellSort koristim.
[ rivan @ 03.12.2004. 07:22 ] @
ovakve stvari se ne resavaju tako u opstem slucaju - fora je sledeca - neka je taj tvoj fajl veliki npr preko 100K i ne mozes da ga sortiras u memoriji, ali mozes da sortiras 10K elemenata u memoriji, ti onda procitas iz fajla 10K elemenata i sortiras ih, pa to upises u novi fajl (npr f_1), pa procitas jos 10K i njih sortiras i upises u f_2 i tako dok ceo pocetni fajl ne razbijes u sortirane komadice (sekvence), onda ti samo ostaje da uradis obican merge tih sortiranih fajlova (uzimas najmanji element iz f_i fajlova i upisujes u krajnji rezultat, i pomeris se za jedno mesto u fajlu iz koga si uzeo element, dok ne pokupis sve elemente svih f_i fajlova).

P.S.
da li negde na forumu ima uputstvo za pisanje teksta - ovi tagovi sa [] me malo zezaju
[ Riste Pejov @ 03.12.2004. 11:24 ] @
Ne vidim razloga imati sve podatke odjednom u memoriji ili citati ceo niz odjednom iz fajl u memoriji i natrag. Bolje reci koja je poenta programa ?

Ako trebas ucitati sve podatke iz jednog fajla i sortirati ih pa natrag u drugi fajl onda je bolje da koristis merge sort pa da to ide korak po korak, recimo sortiras prvih 100K pa onda drugih pa ih merge-ujes i slicno. Ako je pitanje performanse onda je drug problem ... za razlicnih ciljova programa resenje je razlicno. Ako se radi o programu koji treba pretrazivati niz, onda uzmi neku embedded bazu. Razmisli dobro o implementaciju neke DB strukture koja ce da indexira taj niz, mozda B ili Radix drva.

Ovako sa cistom informacijom da se radi 30 miliona clanova ... moguca su jedno 20-tak resenja koji ce se ponasati razlicito u razlicitim situacijama.
[ Srki_82 @ 04.12.2004. 00:48 ] @
E, daaaaaaa... pa baze podataka i nisu tako losa ideja. Ucitas sve podatke u bazu i samo kazes nesto kao SELECT * FROM TabelaElemenata ORDER Element (ili tako nesto) i baza ti sama vrati sve sortirano. Na tebi je da samo ispises (ili sta vec treba da radis) rezultate :)
[ dejan_su @ 04.12.2004. 03:46 ] @
Delovace smesno, ali evo zasto mi treba : zelim da na velikom broju elemenata testiram najpoznatije vrste sortiranja. Dakle u svaku ubacim jedan mali "timer" i lepo izracunam koja metoda za sortiranje je najbrza.
Eto o tome se radi...
[ goky2002 @ 04.12.2004. 10:50 ] @
Mislim da je bolje da procitas neku knjigu o algoritmima.
Postoje drugi efikasniji metodi za procenu algoritama.
Recimo u nekim specijalnim slucajevima jedni algoritmi su brzi od drugih a u opstim nisu, tako da ako potrefis neki "bezveze" niz rezultati nece biti dobri.
[ _Super_Ellite_Bug_ @ 06.12.2004. 21:20 ] @
Pozdrav,
bice ti veci problem tajmer, ako zelis valjano da odradis to sto si zamislio.
Sa dobrim tajmerom(sa dobro kalibrisanim tajmerom) nema potrebe za 30 miliona elemenata, dovoljno je i naprimer 100000 elemenata niza.
[ filmil @ 07.12.2004. 09:05 ] @
Citat:
Sa dobrim tajmerom(sa dobro kalibrisanim tajmerom) nema potrebe za 30 miliona elemenata, dovoljno je i naprimer 100000 elemenata niza.
Zapravo, dovoljno je imati (neveliki) uzorak, ali zato eksperiment ponoviti puno puta. Zatim se iskoriste statistički metodi za procenu trajanja sa odgovarajućim nivoom poverenja. Ili se lepo uzme TAOCP i tamo pročitaju asimptotska vremena izvršavanja za algoritme za sortiranje.

f
[ jablan @ 07.12.2004. 09:20 ] @
Potpuno je različito sortirati 30 i 30 miliona elemenata. To jest, potpuno je različito sortirati stvari u memoriji i sortirati stvari na disku. I jedan i drugi problem su prilično dobro teoretski i praktično pokriveni u zadnjih par desetina godina.
[ filmil @ 07.12.2004. 09:30 ] @
Citat:
Potpuno je različito sortirati 30 i 30 miliona elemenata. To jest, potpuno je različito sortirati stvari u memoriji i sortirati stvari na disku. I jedan i drugi problem su prilično dobro teoretski i praktično pokriveni u zadnjih par
U principu nije potpuno različito, pod uslovom da ili oba sortiranja budu na disku, ili oba u memoriji. Ako znaš kakvi su režijski troškovi (troškovi zauzimanja memorije, inicijalizacije i svega ostalog što traje fiksno vreme), ponavljanjem eksperimenta dovoljan broj puta možeš da isključiš njihov uticaj. Teoretski dakle čak i sa 30 elemenata se može izmeriti, jedino je uputnije uzeti veći uzorak (3e3, 3e4, 3e5 elemenata), čisto da bi konvergencija bila brža.

f
[ jablan @ 07.12.2004. 09:40 ] @
Heh ovo me podseti na onaj vic sa sferičnim kokoškama u vakuumu. U stvarnosti, praktično se nikad ne desi da i niz sa 30 i niz sa 30 miliona elemenata budu ili samo na disku ili samo u memoriji (nešto kao ta Šredingerova mačka: nit je ima nit je nema). Primenjivanje matematičkih metoda na programiranje može da ima prilično katastrofalne posledice u praksi.
[ filmil @ 07.12.2004. 12:19 ] @
Citat:
Primenjivanje matematičkih metoda na programiranje može da ima prilično katastrofalne posledice u praksi. ;)


Ne može da ima katastrofalne posledice ako se ispravno primenjuje, a rezultati tumače kako treba.

Sećam se jednog skorašnjeg primera, gde je neko pitao: „kako to, TCP je reliable delivery protokol a meni se desi greška pri povezivanju?“

f
[ jablan @ 07.12.2004. 12:59 ] @
Ma jeste to tako, ali pitanje koliko sve možeš da aproksimiraš, ako već hoćeš da praviš matematički model. Kako se razvijaju računari, samo se gomilaju nivoi između programa i računara s jedne, i korisnika i programa sa druge strane. Nekad je bilo lako. Imao si procesor, memoriju, disk, i primitivni operativni sistem koji si mogao u prste da poznaješ. Sad između niza od 3e7 (je l' se tako beše piše?) elemenata (ili barem onoga što korisnik ili programer zamišlja kao niz) i računara postoji hard disk, keš na tom disku, dva keša na procesoru, disk keš u memoriji, RDBMS, keširani indeksi u tom RDBMSu, par nivoa između aplikacije i baze, nekoliko nivoa u samoj aplikaciji, uključujući i neki IL. Dok čovek savlada sve nivoe ne bi li koliko toliko tačno mogao da aproksimira svojim modelom, velika je verovatnoća da se nekom tamo diglo da smisli još neki ADO i da ga, s oproštenjem, ugura negde između.
[ filmil @ 07.12.2004. 13:13 ] @
Citat:
Dok čovek savlada sve nivoe ne bi li koliko toliko tačno mogao da aproksimira svojim modelom, velika
Prepoznao sam tek poneku skraćenicu iz tvoje poruke.

Ali svejedno, ako ne znaš šta sedi unutra u crnoj kutiji, nemaš pojma kako da rastumačiš rezultat merenja. Zamisli da dakle imaš sve te ugrađene skraćenice, napraviš merenje i dobiješ neki rezultat. Šta taj rezultat znači? Da li su to najbolje ili najgore ili usrednjene (kako usrednjene?) performanse? Ako izmerim na računaru 1, šta mi to govori o istim tim algoritmima na računaru 2? Ili svejedno, ako izmerim na računaru 1 u vreme t1, šta mi to govori o ponovljenom merenju u vremenu t2? Merenje mi ispljune nekakve brojeve, nekakva vremena. Šta sad ja da radim sa tim brojevima, šta sam iz njih naučio?

Ako čovek izmeri tih 30 miliona elemenata i dobije rezultat, šta može da kaže o rezultatu ako ne pretpostavi ništa dodatno? Recimo uporedi Quick i Merge sort i Quick ispadne brži. Da li može samo na osnovu merenja da kaže da je Quick uvek bolje koristiti? (hint: ne može, jer Quick ima kvadratnu složenost u najgorem slučaju) Ne znam odgovore, al samo kažem da merenje bez modela ne znači mnogo (ili ne znači uopšte).

f
[ jablan @ 07.12.2004. 13:36 ] @
Šta da ti kažem, čini se da je programiranje odavno prestalo da bude nauka i postalo zanat. Kad odeš kod automehaničara, neće čovek da postavlja fizički model automobila, pa sve i da ima PhD mašinstva, nego će se prepustiti iskustvu i instinktima, modeliranje će mu nekad pomoći, nekad neće.
[ filmil @ 07.12.2004. 13:53 ] @
Citat:
Šta da ti kažem, čini se da je programiranje odavno prestalo da bude nauka i postalo zanat.
Svejedno. Neka bude i zanat, ali opet ostaje pitanje: kad sve izmerim, šta mi znači to merenje? Opet imam gomilu brojeva ali pošto je sve zanat, opet ne znam šta sa njima da uradim.

Evo konkretnije pitanje. Izmerim Sort1, dobijem 5.4. Izmerim Sort2 i dobijem 5.3. Šta mogu da kažem o Sort1 i Sort2?
Citat:
Kad odeš kod automehaničara, neće čovek da postavlja fizički model automobila, 
Sigurno da neće, ali to ne znači da ne koristi model. Jedino što ga ne pravi kad ti dođeš, već uzima gotov model kog je dao proizvođač u obliku raznih tabela, grafikona, crteža itd, odn. ono što je naučio o automobilima uopšte.

Čak valjda kod novijih auta sve ovo je mnogo egzaktnije, pošto se automobilski računar poveže sa onim u servisu pa se podešavanja sračunaju automatski. Automatsko podešavanje je nemoguće ako ne postoji bar nekakav model.

f
[ jablan @ 07.12.2004. 14:38 ] @
Odustajem, ova rasprava je postala suviše akademska za mene. Mogu samo da kažem šta bih ja, kao automehaničar, uradio u tvom hipotetičkom slučaju: izmerio bih sort1 i sort2 na nizu neke druge veličine. Ako bi vrednosti i dalje bile tako bliske, odabrao bih algoritam lakši za održavanje (čitaj onaj koji se jednostavnije razume).
[ Srđan Krstić @ 07.12.2004. 18:27 ] @
Ovako:
prvo pitanje sa pocetka: Ako ti tolko nisu jasni pokazivaci, sto lepo ne alociras staticki to sto ti treba ?! Uzmi neki iole novodatumski kompajler i to ne bi trebao biti problem. A sto se tice testiranja brzina, ja sam nekad davno radio to, evo prilazem i kod, i mogu da kazem da su mi u ~20 testiranja (random brojevi) bila vrlo bliska vremena. Testirao sam Quick, Merge i Heap Sort. Evo i tog famoznog koda:
Code:

#include <stdio.h>
#include <stdlib.h>
#include <sys\timeb.h>
#include <conio.h>

#define MaxN 10000000

long a [MaxN], temp [MaxN], time1, time2, n, i, pos;
float tim;

void swap (long x, long y)
{
    long pom;
    pom = temp [x];
    temp [x] = temp [y];
    temp [y] = pom;
}

void swap1 (long x, long y)
{
    long pom;
    pom = a [x];
    a [x] = a [y];
    a [y] = pom;
}

void q_sort (long l, long r)
{
    long i = l, j = r, mid = temp [(l + r) >> 1];
    do
    {
        while (temp [i] < mid)
            i++;
        while (temp [j] > mid)
            j--;
        if (i <= j)
        {
            swap (i, j);
            i++;
            j--;
        }
    }
    while (i <= j);
    if (l < j)
        q_sort (l, j);
    if (i < r)
        q_sort (i, r);
}

void QuickSort ()
{
    q_sort (1, n);
//    for (i = 0; i < n; i++)
//        printf ("%-3d", temp [i + 1]);
//    printf ("\n");
}

void ubaci (long x)
{
    long child, parent;
    pos++;
    temp [pos] = a [x];
    child = pos;
    while (1)
    {
        parent = child >> 1;
        if (parent == 0 || temp [parent] <= temp [child])
            break;
        swap (parent, child);
        child = parent;
    }
}

void izbacimin ()
{
    long parent, child;
    temp [1] = temp [pos];
    pos--;
    parent = 1;
    if (pos > 1)
    {
        child = 2;
        while (child <= pos)
        {
            if (child != pos && temp [child] > temp [child + 1])
                child++;
            if (temp [child] < temp [parent])
            {
                swap (parent, child);
                parent = child;
                child <<= 1;
            }
            else
                child = pos + 1;
        }
    }
}

void HeapSort ()
{
    pos = 0;
    for (i = 0; i < n; i++)
        ubaci (i);
    for (i = 0; i < n; i++)
    {
//        printf ("%-3d", temp [1]);
        izbacimin ();
    }
//    printf ("\n");
}

void m_sort (long l, long r)
{
    long br1, br2, br3, i, mid;
    if (l == r)
        return;
    if (r - l == 1)
    {
        if (a [l] > a [r])
            swap1 (l, r);
        return;
    }
    mid = (l + r) >> 1;
    m_sort (l, mid);
    m_sort (mid + 1, r);
    br1 = l;
    br2 = mid + 1;
    br3 = l - 1;
    while (!(br1 > mid && br2 > r))
    {
        br3++;
        if (br1 > mid)
        {
            temp [br3] = a [br2];
            br2++;
            continue;
        }
        if (br2 > r)
        {
            temp [br3] = a [br1];
            br1++;
            continue;
        }
        if (a [br1] < a [br2])
        {
            temp [br3] = a [br1];
            br1++;
        }
        else
        {
            temp [br3] = a [br2];
            br2++;
        }
    }
    for (i = l; i <= r; i++)
        a [i] = temp [i];
}

void MergeSort ()
{
    m_sort (0, n - 1);
//    for (i = 0; i < n; i++)
//        printf ("%-3d", a [i]);
//    printf ("\n");
}

void main ()
{
    clrscr ();
    struct timeb t;
    n = MaxN - 5;
//    randomize ();
    for (i = 0; i < n; i++)
    {
        a [i] = rand ();
//        printf ("%-3d", a [i]);
    }
//    printf ("\n\n");

    for (i = 0; i < n; i++)
        temp [i + 1] = a [i];


    ftime (&t);
    time1 = (t.time % 100) * 1000 + t.millitm;

    QuickSort ();

    ftime (&t);
    time2 = (t.time % 100) * 1000 + t.millitm;
    tim = (time2 - time1);
    tim /= 1000;
    printf ("QuickSort: %.2f\n\n", tim);

    ftime (&t);
    time1 = (t.time % 100) * 1000 + t.millitm;

    HeapSort ();

    ftime (&t);
    time2 = (t.time % 100) * 1000 + t.millitm;
    tim = (time2 - time1);
    tim /= 1000;
    printf ("HeapSort: %.2f\n\n", tim);

    ftime (&t);
    time1 = (t.time % 100) * 1000 + t.millitm;

    MergeSort ();

    ftime (&t);
    time2 = (t.time % 100) * 1000 + t.millitm;
    tim = (time2 - time1);
    tim /= 1000;
    printf ("MergeSort: %.2f\n", tim);
    exit (0);
}
[ _Super_Ellite_Bug_ @ 08.12.2004. 19:54 ] @
I nije bas "famozan" kod, ali je lepo zamisljeno.
Evo malko boljeg primera iz literature koji je vec toliko prozvakan da me cudi da nije primenjena neka slicna analogija. Ovde je samo stavljen QuickSort kao primer, ali lako se daju ubaciti i ostali.

//----------------------------------------------------------------------------
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

/* timer variables for seconds and microseconds */
#define start_sec 9
#define start_usec 0
#define max_usec 1000000

/* declare variables common to the process environment */
static int signal_1_flag = 0;
static int signal_2_flag = 0;

static void signal_start_handler (int signo) {
/* function to start processing in child by setting signal 1 flag*/
if (signo == SIGUSR1) {
printf ("Starting work in child process.\n");
signal_1_flag = 1;
return;
}
else {
printf ("Error handling signal to child process.\n");
exit (1);
}
}

static void signal_compute_time (int signo) {
/* function to start computation of elapsed time by setting signal 2 flag */
if (signo == SIGUSR2) {
printf ("Starting elapsed-time computation in parent.\n");
signal_2_flag = 1;
return;
}
else {
printf ("Error handling signal to parent process.\n");
exit (1);
}
}

/* child will perform quicksort on n elements as work to be timed */
#define array_size 100000
void quicksort (int a[], int n);

int main (void) {
pid_t pid; /* variable to record process id of child */
int temp; /* temporary variable, not used for real data */
struct itimerval ival; /* variable to set timer values */
struct itimerval real_time; /* variable to retrieve times from timer */

printf ("Starting program in which parent times work in child process\n\n");

/* prepare the signal handlers for two signals */
if (signal(SIGUSR1, signal_start_handler) == SIG_ERR)
printf ("Initial setup error: unable to create handler for SIGUSR1.\n");
if (signal(SIGUSR2, signal_compute_time) == SIG_ERR)
printf ("Initial setup error: unable to create handler for SIGUSR2.\n");

/* spawn child process */
pid = fork(); /* create new process */
if (-1 == pid) /* check for error in spawning child process */
{ perror ("Error in fork");
exit (1);
}

if (0 == pid) /* check if this is the new child process */
{ /* processing for child */
printf ("Starting child process\n");
printf ("Child pid: %d; parent pid: %d\n", getpid(), getppid());

/* waste time until SIGUSR1 signal tells child to start */
while (!signal_1_flag) /* terminates when SIGUSR1 signal is received */
temp = 1;

/* meaningful work goes here */
{ /* set up array for quicksort */
int i;
int a[array_size];
for (i = 0; i < array_size; i++)
a = rand ();
quicksort (a, array_size);
}
/* signal parent process when done */
kill (getppid(), SIGUSR2);

/* end child process */
printf ("Exiting child process\n");
exit (0);
}
else
{ /* processing for parent */
printf ("Continuing processing in parent process.\n");

/* set interval timer */
ival.it_interval.tv_sec = start_sec; /* initialize second field */
ival.it_interval.tv_usec = start_usec; /* initialize microsecond field */
ival.it_value.tv_sec = start_sec; /* reset second field */
ival.it_value.tv_usec = start_usec; /* reset microsecond field */
setitimer(ITIMER_REAL, &ival, NULL);

/* signal child with SIGUSR1 */
kill (pid, SIGUSR1);

/* waste time until SIGUSR2 signal indicates child's work done */
while (!signal_2_flag) /* terminates when SIGUSR2 signal is received */
temp = 1;
/* above loop will stop only when SIGUSR2 signal is received */

getitimer(ITIMER_REAL, &real_time);
printf ("Elapsed time is %d seconds, %d microseconds\n",
start_sec - real_time.it_value.tv_sec - 1,
max_usec - real_time.it_value.tv_usec);
/* end parent process */
printf ("Exiting parent process\n");
exit (0);
}
}

/* functions for the quicksort */
void partition (int a[], int left, int right, int *middle) {
/* places a[left] in position a[*middle],
permuting a[left]..a[right] so a[left]..a[middle-1] <= a[*middle]
and a[*middle] <= a[(*middle)+1]..a[right] */
int l_spot = left+1;
int r_spot = right;
int temp;

while (l_spot <= r_spot) {
while ((l_spot <= r_spot)&&(a[left] <= a[r_spot]))
r_spot--;
while ((l_spot <= r_spot)&&(a[l_spot] <= a[left]))
l_spot++;
if (l_spot <= r_spot) {
temp = a[r_spot];
a[r_spot] = a[l_spot];
a[l_spot] = temp;
}
}
temp = a[r_spot];
a[r_spot] = a[left];
a[left] = temp;
*middle = r_spot;
}


void quicksort (int a[], int n) {
/* performs quicksort to order elements in array a */
int mid;
if (n > 1) {
partition (a, 0, n-1, &mid);
quicksort (a, mid);
quicksort (a+mid+1,n - (mid+1));
}
}
//----------------------------------------------------------------------------

[ dejan_su @ 09.12.2004. 16:37 ] @
Evo ja sam napravio sto sam hteo, jedino je problem sto mi uradi 30 hiljada elemenata, kad unesem vise samo stoji, a zauzece procesora je 100%! Ostavio sam ga 3 sata tako i nista. Evo i fajl dole...
[ Damjan S. Vujnovic @ 09.12.2004. 16:48 ] @
Jel' tacno 30000 magicna granica, ili mozda 32767

Pozdrav,
D.

P.S. Koliko me pamcenje sluzi, neko te je vec na samom pocetku upozorio na ovo...
[ dejan_su @ 09.12.2004. 17:10 ] @
Ali zasto bi ti bilo ogranicenje ako radim dinamicki. Ne bi jedino memorija mogla da bude ogranicenje? Ili je to mozda jer DOS vidi samo 1 MB...
[ Damjan S. Vujnovic @ 09.12.2004. 18:26 ] @
Pogledaj prvi trooper-ov odgovor i obrati paznju na komentar na vrhu prilozenog koda.

D

hint: 32767 + 1 = ?
[ dejan_su @ 09.12.2004. 19:04 ] @
A sta ako recimo instaliram Visual C++.NET i tamo napravim ovaj program pod "Console Application"? Hocu li i onda imati ogranicenje?