Forum » Programiranje » [C++] QuickSort in QuickSort z mediano
[C++] QuickSort in QuickSort z mediano
EdHardy ::
Pozdravljeni,
pri nalogi moram neko zaporedje (polje) urediti naraščajoče in sicer na 2 načina:
- QuickSort brez mediane
- QuickSort z mediano
http://codepad.org/83I5npLW
Ta koda je napisana po naslednjih navodilih, vendar se vedno ne deluje. Ne gre za napako v sintaksi. Problem je ko probam po urejanju polje izpisat, se nic ne izpise v konzolo. Pred urejanjem pa se polje brez problema izpise. Morda sem kje narobe interpretiral navodila in jih narobe pretvoril v kodo ?
NAVODILA :
QuickSort:
Deli:
Dodatek za funkcijo deli, ce zelim QuickSort z mediano:
+ Zanima še me, kam dodam to kodo iz zadnje slike, tako da bo QuickSort uporabil mediano ?
Lp
pri nalogi moram neko zaporedje (polje) urediti naraščajoče in sicer na 2 načina:
- QuickSort brez mediane
- QuickSort z mediano
http://codepad.org/83I5npLW
Ta koda je napisana po naslednjih navodilih, vendar se vedno ne deluje. Ne gre za napako v sintaksi. Problem je ko probam po urejanju polje izpisat, se nic ne izpise v konzolo. Pred urejanjem pa se polje brez problema izpise. Morda sem kje narobe interpretiral navodila in jih narobe pretvoril v kodo ?
NAVODILA :
QuickSort:
Deli:
Dodatek za funkcijo deli, ce zelim QuickSort z mediano:
+ Zanima še me, kam dodam to kodo iz zadnje slike, tako da bo QuickSort uporabil mediano ?
Lp
- spremenil: EdHardy ()
smacker ::
Si prebral kaj piše v outputu? Sintaktična napaka. Pri do-while ti manjka ; za while(pogoj); Vrstica 23 in 27.
smoke ::
Če ti kaj koristi, sem jaz algoritem par let nazaj implementiral.
Primer uporabe:
LP
#include <algorithm> #include <utility> namespace internal { template <typename RandomAccessIter, typename Compare> std::pair<RandomAccessIter, RandomAccessIter> partition(RandomAccessIter begin, RandomAccessIter end, Compare compare) { std::iter_swap(begin, (begin + (end - begin) / 2)); auto v = *begin; auto mk = begin; auto i = begin; auto vk = end - 1; while (!(vk < i)) { if (compare(*i, v)) std::iter_swap(mk++, i++); else if (compare(v, *i)) std::iter_swap(vk--, i); else ++i; } return std::make_pair(mk, ++vk); } } // namespace internal template <typename RandomAccessIter, typename Compare> void quick_sort(RandomAccessIter begin, RandomAccessIter end, Compare compare) { if ((end - begin) < 2) return; auto r = internal::partition(begin, end, compare); quick_sort(begin, r.first, compare); quick_sort(r.second, end, compare); }
Primer uporabe:
#include <vector> #include "quick_sort.h" int main(int argc, char** argv) { std::vector<int> stevila = {6, 2, 7, 2, 7, 0, 3, 6, 22, 256, 53, 6, 1, 2, 6, 2, 2, 7}; quick_sort(std::begin(stevila), std::end(stevila), [](int a, int b) { return a < b; }); return 0; }
LP
amacar ::
Moja par let stara naloga:
#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; int deli(int zaporedje[],int dno,int vrh) { int pe; int l; int d; int m; m=(dno+vrh)/2; int zamenjaj=zaporedje[m]; zaporedje[m]=zaporedje[dno]; zaporedje[dno]=zamenjaj; pe=zaporedje[dno]; l=dno; d=vrh; while(l<d) { while(zaporedje[l]<=pe && l<vrh) { l=l+1; } while(zaporedje[d]>=pe && d>dno) { d=d-1; } if(l<d) { int zacasni=zaporedje[d]; zaporedje[d]=zaporedje[l]; zaporedje[l]=zacasni; } else { int zacasni=zaporedje[d]; zaporedje[d]=zaporedje[dno]; zaporedje[dno]=zacasni; } } return d; } void hitro_uredi(int zaporedje[],int dno,int vrh) { int j; if(dno<vrh) { j=deli(zaporedje,dno,vrh); hitro_uredi(zaporedje,dno,j-1); hitro_uredi(zaporedje,j+1,vrh); } } bool preveri(int zaporedje[],int dno,int vrh) { for(int i=dno;i<vrh-1;i++) { if(zaporedje[i+1]<zaporedje[i]) { cout<<endl<<"Zaporedje je urejeno napacno!"<<endl; return 0; } } return 1; } void random(int zaporedje[],int velikost1) { for(int x=0;x<velikost1;x++) { zaporedje[x]=rand(); } } void izpisi(int zaporedje[],int velikost1) { for(int x=0; x<velikost1;x++) { cout<< zaporedje[x]<<" "; } } void urejeno_narascajoce(int zaporedje[],int velikost1) { for(int x=0;x<velikost1;x++) { zaporedje[x]=x+1; } } void urejeno_padajoce(int zaporedje[],int velikost1) { for(int x=0;x<velikost1;x++) { zaporedje[x]=velikost1-x; } } int main() { srand((unsigned)time(NULL)); int *zaporedje=NULL; int velikost1=0; int menu; clock_t zacetek,konec; double cas; do { cout<<endl<<"Hitro uredi - izbira:"<<endl; cout<<endl; cout<<"1 Generiraj nakljucno zaporedje"<<endl; cout<<"2 Generiraj urejeno narascajoce zaporedje"<<endl; cout<<"3 Generiraj urejeno padajoce zaporedje"<<endl; cout<<"4 Izpis zaporedja"<<endl; cout<<"5 Uredi"<<endl; cout<<"6 Konec"<<endl; cin>>menu; if(menu==1) { cout<<endl<<"Vnesite kolicino generiranih stevil: "; cin>>velikost1; zaporedje=new int[velikost1]; random(zaporedje,velikost1); } else if(menu==2) { cout<<endl<<"Vnesite kolicino generiranih stevil: "; cin>>velikost1; zaporedje=new int[velikost1]; urejeno_narascajoce(zaporedje,velikost1); } else if(menu==3) { cout<<endl<<"Vnesite kolicino generiranih stevil: "; cin>>velikost1; zaporedje=new int[velikost1]; urejeno_padajoce(zaporedje,velikost1); } else if(menu==4) { if(velikost1==0) { cout<<endl<<"Najprej generirajte zaporedje!"<<endl; } else { izpisi(zaporedje,velikost1); } } else if(menu==5) { if(velikost1==0) { cout<<endl<<"Najprej generirajte zaporedje!"<<endl; } else { zacetek=clock(); hitro_uredi(zaporedje,0,velikost1-1); konec=clock(); cas=(double)(konec-zacetek)/CLOCKS_PER_SEC; cout<<endl<<"Urejanje je trajalo: "<<cas<<" sekund!"; if(preveri(zaporedje,0,velikost1)==0) { } else { cout<<endl<<"Zaporedje je sedaj narascajoce urejeno"<<endl; } } } } while(menu!=6); delete zaporedje; return 0; }
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Quicksort algoritemOddelek: Programiranje | 1434 (986) | krneki0001 |
» | [Java] QuicksortOddelek: Programiranje | 750 (586) | MrBrdo |
» | Quick sort ascending/descendingOddelek: Programiranje | 2059 (1739) | infiniteLoop |
» | It means business (strani: 1 2 3 4 5 6 7 8 )Oddelek: Znanost in tehnologija | 28459 (14458) | Thomas |
» | [Turbo Pascal] Pomoč...Oddelek: Programiranje | 1487 (1389) | Grey |