Forum » Programiranje » [C++] Insertion sort - problem
[C++] Insertion sort - problem
golobich ::
Zdravo!
Imam namreč ne problem. V šoli pri programiranju smo začeli z snovjo metode urejanja. Omenili smo tri metode. Bubble sort, Selection sort in Insertion sort. In smo dobili nalogo napisat program ki ti pove čas urejanja, število menjav in število preverjanj števil, pol pa tabelo še naredit,...
No, spodaj sem prilepil kodo ki sem jo do sedaj napisa. Vse dela lepo in prav razen število preverjanj me malo zafrkava. Namreč število preverjanj mi je enako številu izvedbe for zanke. Ne šteje mi pa tudi ko se while zanka izvede (na 1 for zanko se lahko while zanka večkrat izvede).
Zanima me če bi mi lahko kdo pomagal in mi napisal kako bi rešil ta problem.
Hvala!
Lp, golobich ;)
Imam namreč ne problem. V šoli pri programiranju smo začeli z snovjo metode urejanja. Omenili smo tri metode. Bubble sort, Selection sort in Insertion sort. In smo dobili nalogo napisat program ki ti pove čas urejanja, število menjav in število preverjanj števil, pol pa tabelo še naredit,...
No, spodaj sem prilepil kodo ki sem jo do sedaj napisa. Vse dela lepo in prav razen število preverjanj me malo zafrkava. Namreč število preverjanj mi je enako številu izvedbe for zanke. Ne šteje mi pa tudi ko se while zanka izvede (na 1 for zanko se lahko while zanka večkrat izvede).
Zanima me če bi mi lahko kdo pomagal in mi napisal kako bi rešil ta problem.
Hvala!
Lp, golobich ;)
#include <iostream> #include <time.h> using namespace std; int tab[5]; //INSERTION SORT void uredi (int n) //a = število polj { int j, temp; //int zacasno = 0; //int trenutno = 0; int st_preverjanj = 0; int st_menjav = 0; for (int i=0; i<n; i++) { j = i; // zacasno++; st_preverjanj++; while ((j>0)&& ((tab[j-1]) > (tab[j])) ) { //if (zacasno==trenutno) temp = tab[j]; tab[j] = tab[j-1]; tab[j-1] = temp; j--; st_menjav++; // trenutno = zacasno; } } cout <<endl; cout<<"Število menjav: "<<st_menjav<<endl; cout<<"Število preverjanj: "<<st_preverjanj+zacasno<<endl; } void narascajoce (int n) { for (int i=0; i<n; i++) { tab[i]=i+1; cout << tab[i] <<", "; } } void padajoce (int n) { int j=n; for (int i=0; i<n; i++) { tab[i]=j; cout << tab[i] <<", "; j--; } } void nakljucno (int n) { srand(time(NULL)); for (int i=0; i<n; i++) { tab[i]=rand()%40+1; cout <<tab[i] <<", "; } } int main () { int n=5; char izbira; cout << "Kako želite da je tabela napolnjena na zacetku?\n\t 1) Nakljucno\n\t 2) Najprej najmanjsi\n\t 3) Najprej najvecji\n"<<endl; cin >> izbira; for (int i=1; i>0; i++) { if (izbira == '1') { nakljucno(n); break; } else if (izbira == '2') { narascajoce(n); break; } else if (izbira == '3') { padajoce(n); break; } else { cout << "Vnesite pravilni znak (1, 2 ali 3)!"<<endl; } } clock_t start, finish; start = clock(); uredi (n); finish = clock(); cout <<"Cas: "<<(double(finish-start)/CLOCKS_PER_SEC)<<endl; cout<<endl; for (int i=0; i<n; i++) { cout << tab[i] <<", "; } cout << endl; system ("pause"); return 0; }
Thomas ::
Zakaj ne daš "st_preverjanj++;" v while zanko?
Man muss immer generalisieren - Carl Jacobi
golobich ::
Moreš upoštevat da se while zanka ne izvede vedno. Izvede se samo ko se števili zamenjata. To je pa število menjav. To je pa že v zanki ;)
Thomas ::
Potem pa moraš tisti izraz v while predizračunati v dve spremenljivki. In šteti samo zamenjave, kadar do njih dejansko pride.
Man muss immer generalisieren - Carl Jacobi
golobich ::
Ja sej. Do zamenjave pride ko se while zanka izvede. Drugače ne pride do zamenjave.
Ali misliš kako drugače?
Ali misliš kako drugače?
Thomas ::
Ne, jaz mislim, da je dobro, če povečaš spremenljivko znotrej while-ta.
Ker je poleg menjave tam še preverjanje.
Ker je poleg menjave tam še preverjanje.
Man muss immer generalisieren - Carl Jacobi
Genetic ::
Logicni pogoj, ki ga imas v zanki, das v svojo metodo, kjer preveris pogoj in povecas st. preverjanj, ali pa, bolj grdo:
while ((++st_preverjanj) && ((j>0)&& ((tab[j-1]) > (tab[j]))) )
while ((++st_preverjanj) && ((j>0)&& ((tab[j-1]) > (tab[j]))) )
Thomas ::
Mej kokr češ, vendar kar ti je povedal genetic, žal ni prav.
Tista while zanka, ki najprej poveča število preverjanj, pade ven pri j==0. In ne gre preverjat neenakosti naprej, čeprav se je povečala vrednost spremenljivke ki šteje preverjanja.
Napaka.
Tista while zanka, ki najprej poveča število preverjanj, pade ven pri j==0. In ne gre preverjat neenakosti naprej, čeprav se je povečala vrednost spremenljivke ki šteje preverjanja.
Napaka.
Man muss immer generalisieren - Carl Jacobi
Genetic ::
no, pa bo malo zmutil ter dal ++st_preverjanj v tisti del pogoja, kjer dejansko preverja ...
Thomas ::
Lahko pa narediš tako, kot sem rekel v prvem odgovoru in konec.
Man muss immer generalisieren - Carl Jacobi
Genetic ::
V tem primeru pa ne bo povecalo st. primerjanj, ce bo primerjanje (tab[j-1]) > (tab[j]) false
Thomas ::
tem primeru pa ne bo povecalo st. primerjanj, ce bo primerjanje (tab[j-1]) > (tab[j]) false
Sej maš povečanje števca TUDI zgoraj.
Man muss immer generalisieren - Carl Jacobi
xordie ::
Zakaj zacnes for zanko z "i=0", ce v tem primeru ne naredis nicesar?
Ce postavis na zacetku "i=1" ne potrebujes preverjanja "j>0" v while zanki. Za stevec preverjanj pa ti je Thomas povedal.
Ce postavis na zacetku "i=1" ne potrebujes preverjanja "j>0" v while zanki. Za stevec preverjanj pa ti je Thomas povedal.
x
Thomas ::
More nekako mert spodnjo mejo, do kamor tisti j niža. Tole je standardna izvedenka insertion sorta, vsi jo tako pišejo. Vendar tudi meni to ni všeč in se mislim mau poglobit v zadevo.
Man muss immer generalisieren - Carl Jacobi
Thomas ::
No, smo vrgli tale insertion sort Critticallu v gobec. Kaj je naredil, si lahko ogledate tule:
http://critticall.com/insertionsort.html
http://critticall.com/insertionsort.html
Man muss immer generalisieren - Carl Jacobi
Thomas ::
Bom dal še tle kodo popravljenega (Critticall) urejanja z vrivanjem, po domače insertion sorta.
one=0; jm=0; i=1; while (i<n) { temp1=tab[jm]; one=i; temp2=tab[one]; while (temp1>temp2) { tab[jm]=temp2; tab[one]=temp1; if (jm==zero) { break; } one=jm; jm--; temp1=tab[jm]; } jm=i; i++; }
Man muss immer generalisieren - Carl Jacobi
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Algoritmi za urejanje tabelOddelek: Programiranje | 1218 (955) | lebdim |
» | Quicksort algoritemOddelek: Programiranje | 1410 (962) | krneki0001 |
» | Digitalna evolucija (strani: 1 2 3 4 … 26 27 28 29 )Oddelek: Znanost in tehnologija | 75388 (25557) | pietro |
» | [JavaScript] Sortiranje šumnikovOddelek: Programiranje | 2135 (1869) | MarkookraM |
» | [c++]UrejanjepoljaOddelek: Programiranje | 1347 (1168) | purki |