;HybridSort algoritam - kombinacija QuickSort algoritma i MergeSort algoritma. VerboseMode ON ;Kaze ArithmeticExpressionCompileru da u asemblerski kod koji ispisuje stavi vise komentara. AsmStart ispisPoruka=1 macro staviIntNaSistemskiStog x ;"x" treba biti pokazivac na 32-bitni decimalni broj ("float"), kojeg ce ova makro-naredba pretvoriti u 32-bitni cijeli broj ("int") i staviti na sistemski stog. { sub esp,4 fld dword [x] fistp dword [esp] } macro staviPokazivacNaSistemskiStog x { sub esp,4 lea ebx,[x] mov [esp],ebx } macro staviStringNaSistemskiStog x { sub esp,4 mov dword [esp],x } format PE console ;"PE" je 32-bitna Windowsova ".EXE" datoteka (to nije sve sto FlatAssembler moze stvarati). entry start include 'win32a.inc' ;FlatAssemblerove naredbe za upravljanje DLL-ovima (ovdje se koriste za pozivanje C-ovih funkcija iz MSVCRT-a). section '.text' code executable start: if ispisPoruka=1 jmp velicinaUnosa$ velicinaUnosa db "Unesite koliko cete brojeva unijeti.",10,0 velicinaUnosa$: staviStringNaSistemskiStog velicinaUnosa call [printf] end if staviPokazivacNaSistemskiStog n jmp znakZaFloat$ znakZaFloat db "%f",0 znakZaFloat$: staviStringNaSistemskiStog znakZaFloat call [scanf] if ispisPoruka=1 jmp pitajZaUnos$ pitajZaUnos db "Unesite te brojeve:",10,0 pitajZaUnos$: staviStringNaSistemskiStog pitajZaUnos call [printf] end if AsmEnd i:=0 brojac:=0 vrhStoga:=0 While i0 gornjaGranica:=stogSGornjimGranicama(vrhStoga) donjaGranica:=stogSDonjimGranicama(vrhStoga) vrhStoga:=vrhStoga-1 gdjeJePivot:=donjaGranica i:=donjaGranica+1 While idonjaGranica+1 vrhStoga:=vrhStoga+1 stogSDonjimGranicama(vrhStoga):=donjaGranica stogSGornjimGranicama(vrhStoga):=gdjeJePivot EndIf testZaPreljev:=brojac+najmanjiCijeliBrojKojiSeMozeDodatiNaBrojac ;Potrebna je posebna varijabla za to jer FPU interno radi s 80-bitnim brojevima, a CPU s 32-bitnim. Izgubio sam hrpu vremena da to shvatim. If not(testZaPreljev>brojac) najmanjiCijeliBrojKojiSeMozeDodatiNaBrojac:=najmanjiCijeliBrojKojiSeMozeDodatiNaBrojac*2 AsmStart if ispisPoruka=1 jmp izvjesceOpreljevu$ izvjesceOpreljevu db "Upozorenje: Brojac mozda nece sadrzavati tocan rezultat, dogodio se preljev na %d. iteraciji." db " Najveca ocekivana pogreska za ovaj preljev je %d krivo prebrojanih izvrsavanja unutarnje petlje.",10,0 izvjesceOpreljevu$: fld dword [gornjaGranica] fld dword [donjaGranica] fsubp fabs fistp dword [esp+4] fld dword [brojac] fistp dword [esp] invoke printf,izvjesceOpreljevu end if AsmEnd EndIf EndWhile Else AsmStart if ispisPoruka=1 jmp radimoMergeSort$ radimoMergeSort db "Primijenit cemo MergeSort algoritam.",10,0 radimoMergeSort$: invoke printf,radimoMergeSort end if AsmEnd vrhStoga:=vrhStoga+1 stogSDonjimGranicama(vrhStoga):=0 stogSGornjimGranicama(vrhStoga):=n stogSPodacimaTrebaLiPetljaRazdvajatiIliSpajatiNizove(vrhStoga):=razdvajati While vrhStoga>0 gornjaGranica:=stogSGornjimGranicama(vrhStoga) donjaGranica:=stogSDonjimGranicama(vrhStoga) trebaLiSpajatiIliRazdvajati:=stogSPodacimaTrebaLiPetljaRazdvajatiIliSpajatiNizove(vrhStoga) vrhStoga:=vrhStoga-1 sredinaNiza:=(donjaGranica+gornjaGranica)/2 sredinaNiza:=sredinaNiza-mod(sredinaNiza,1) If trebaLiSpajatiIliRazdvajati=razdvajati ;Razdvoji niz original(donjaGranica..gornjaGranica-1) na original(donjaGranica..sredinaNiza-1) i original(sredinaNiza..gornjaGranica-1). If gornjaGranica-donjaGranica>1 ;Niz velicine 0 ili 1 vec je poredan i ne radimo nista dalje. vrhStoga:=vrhStoga+1 stogSDonjimGranicama(vrhStoga):=donjaGranica stogSGornjimGranicama(vrhStoga):=gornjaGranica stogSPodacimaTrebaLiPetljaRazdvajatiIliSpajatiNizove(vrhStoga):=spajati ;Stavljamo naputak za spajanje nizova prvog na stog kako bi on onda bio zadnji izvaden iz njega. vrhStoga:=vrhStoga+1 stogSDonjimGranicama(vrhStoga):=donjaGranica stogSGornjimGranicama(vrhStoga):=sredinaNiza stogSPodacimaTrebaLiPetljaRazdvajatiIliSpajatiNizove(vrhStoga):=razdvajati vrhStoga:=vrhStoga+1 stogSDonjimGranicama(vrhStoga):=sredinaNiza stogSGornjimGranicama(vrhStoga):=gornjaGranica stogSPodacimaTrebaLiPetljaRazdvajatiIliSpajatiNizove(vrhStoga):=razdvajati EndIf Else ;Spoji vec poredane nizove original(donjaGranica..sredinaNiza-1) i original(sredinaNiza..gornjaGranica-1) u novi poredani niz original(donjaGranica..gornjaGranica-1). i:=donjaGranica gdjeSmoUPrvomNizu:=donjaGranica gdjeSmoUDrugomNizu:=sredinaNiza While i