Witajcie,
Mam pewien problem z sortowaniem quicksort. Mam napisać program który będzie sortował tablice, najpierw jak sprawdzamy elementy idąc od jednej strony, następnie idąc od początku i końca, a następnie wybierając sobie element względem którego będziemy sortowali poprzez medianę z końcowego, początkowego i środkowego elementu. Napisałem taki oto program i nie wiem dlaczego nie działa, już nie wiem co mogę poprawić więc proszę was o pomoc. Z góry dziękuje.
PS. Jakby coś było niejasne w kodzie to napiszcie to go lepiej skomentuję.
#include <iostream>
using namespace std;
void swap(int i, int j, int tab[])
{
int pom=tab[i];
tab[i]=tab[j];
tab[j]=pom;
}
//10 elementowa
int partition1(int L, int R, int *tab)//wtedy kiedy oba ida od lewej strony
{
int m=L-1;
int n;
int x = tab[R];
while (tab[m+1] < x) { m++; }
while(1)
{
n=m+1;
while(tab[n]>x)
{n++;
if(n<R)
{
swap(m+1,R,tab);
}
else return n;
}
}
}
int partition2(int L, int R, int *tab) // wtedy kiedy jedno idzie od lewej a drugie od prawej
{
int x=tab[L];
int i = L-1;
int j = R+1;
while(1)
{
while(tab[j]<=x)
{
j--;
break;
}
while(tab[i]>=x)
{
i--;
break;
}
if(i<j)
{
swap(i,j,tab);
}
else return j;
}
}
int partition3(int L, int R, int *tab)
{
int l=tab[L];
int r=tab[R];
int temp=0;
for (int i=L; i<=R; i++) {temp++;}
int pom = temp/2;
int m=tab[pom];
int wartmod;
if ((l>r && l<m) || (l>r && l<m)) wartmod=l;
if ((r>m && r<l) || (r>l && r<m)) wartmod=r;
if ((m>r && m<l) || (m>r && m<r)) wartmod=m;
int x = tab[wartmod];
partition1(L,R,tab);
return wartmod;
}
void quicksort1(int L, int R, int *tab)
{
if (L<=R)
{
int p;
p = partition1(L,R,tab);
quicksort1(L,p-1,tab);
quicksort1(p+1,R,tab);
}
}
void quicksort2(int L, int R, int *tab)
{
if (L<R)
{
int p;
p = partition2(L,R,tab);
quicksort2(L,p-1,tab);
quicksort2(p+1,R,tab);
}
}
void quicksort3(int L, int R, int *tab)
{
if (L<R)
{
int p;
p = partition3(L,R,tab);
quicksort3(L,p-1,tab);
quicksort3(p+1,R,tab);
}
}
int main()
{
int tab[10] = {3,5,8,2,4,1,4,6,2,1};
int L = 0;
int R = 9;
quicksort1(L,R,tab);
quicksort2(L,R,tab);
quicksort3(L,R,tab);
for (int i = 0; i < 10; i++)
{
cout << tab[i] << endl;
}
system("pause");
return 0;
}