» »

[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
  • spremenil: EdHardy ()

EdHardy ::

Se opravicujem za tezavo s slikami:

QuickSort:


Deli:


Deli z mediano:

Zgodovina sprememb…

  • 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.

#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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Quicksort algoritem

Oddelek: Programiranje
161325 (877) krneki0001
»

[Java] Quicksort

Oddelek: Programiranje
6670 (506) MrBrdo
»

Quick sort ascending/descending

Oddelek: Programiranje
161903 (1583) infiniteLoop
»

It means business (strani: 1 2 3 4 5 6 7 8 )

Oddelek: Znanost in tehnologija
37427290 (13289) Thomas
»

[Turbo Pascal] Pomoč...

Oddelek: Programiranje
131393 (1295) Grey

Več podobnih tem