Sortowanie Min Max

0

Witam. Do napisania mam program sortujący. Najpierw tworzy tablice o podanym rozmiarze, następnie wypełnia ją tab[0]=0, tab[1]=1, miesza ją i sortuje. Sortowanie takiej tablicy ma się wykonać 5 razy, żeby policzyć średnią arytmetyczną pojedynczego sortowania. Potem rozmiar zwiększa się i tablica znowu jest wypełniana itd..
Sortowanie ma wyszukiwać minimalną i maksymalną wartość z tablicy, wstawiać je jako pierwszy(min), i ostatni element(max), a następnie "ucinać" tą tablice na końcu i początku i rekurencyjnie powtarzać to dla zmniejszonej tablicy.
p jest to minimalny indeks, k jest to maksymalny indeks tablicy. Niestety nie mogę znaleźć błędu.. Tutaj kod:

#include<iostream>
#include<cstdio>
#include<time.h>
#include<ctime>
#include<algorithm>
#include<fstream>

FILE *plik;

void sortowanieminmax_(int *tab, int rozmiar, int p, int k)

{
	int max, min, j, pom;
	for (int i = 0; i < rozmiar; i++)
	{
		std::cout << tab[i] << "\n";
	}
	system("pause");
	if (k - p >= 0)
	{
		max = p;
		min = p;
		for (j = p; j < k + 1; j++)
		{
			if (tab[j] < tab[min])
			{
				min = j;
			}
			if (tab[j]>tab[max])
			{
				max = j;
			}
		}
		pom = tab[p];
		tab[p] = tab[min];
		tab[min] = pom;
		pom = tab[k];
		tab[k] = tab[max];
		tab[max] = pom;
		p = p + 1;
		k = k - 1;
		sortowanieminmax_(tab, rozmiar, p, k);
	}

}
void sortowanieminmax(int* tab, int rozmiar, double TabPom[])
{
	int w, i, sprawdzanie, z;
	clock_t start, koniec;
	double srednia;

	printf("Sortowanie min-max:\n");
	fprintf(plik, "Sortowanie min-max:\n");
	for (w = 0; w < 8; w++) // tworzenie tablic
	{
		rozmiar = rozmiar + rozmiar;
		tab = (int*)malloc(sizeof(int)*rozmiar);

		for (i = 0; i < rozmiar; i++) // wypelnianie tablicy tab[1]=1 itd...
		{
			tab[i] = i;
		}
		for (z = 0; z < 5; z++) // petla do mieszania i sortowania 5 razy zeby policzyc srednia arytmetyczna
		{
			std::random_shuffle(tab, tab + rozmiar);
			start = clock(); // zaczyna mierzyc czas
			/// sortowanie MIN_MAX


			sortowanieminmax_(tab, rozmiar, 0, rozmiar - 1);


			/// sortowanie MIN_MAX
			koniec = clock(); //konczy mierzyc czas
			TabPom[z] = koniec - start;
			for (sprawdzanie = 0; sprawdzanie < rozmiar - 1; sprawdzanie++)
			{
				if (tab[sprawdzanie] > tab[sprawdzanie + 1])
				{
					printf("Zle\n");
					break;
				}
			}
		}
		srednia = (TabPom[0] + TabPom[1] + TabPom[2] + TabPom[3] + TabPom[4]) / 5;
		printf("Dla tablicy %d elementowej zajelo to srednio %f sekund.\n", rozmiar, ((float)srednia) / CLOCKS_PER_SEC); // srednia arytm. 5 sortowan dla 1 tablicy
		fprintf(plik, "Dla tablicy %d elementowej zajelo to srednio %f sekund.\n", rozmiar, ((float)srednia) / CLOCKS_PER_SEC);
		free(tab);
	}
}

int main()
{
	plik = fopen("wyniki.txt", "a");
	int rozmiar = 5;
	double TabPom[5];
	int *tab = NULL;
	sortowanieminmax(tab, rozmiar, TabPom);
	fclose(plik);
	return 0;
} 
0

Problem udało mi się rozwiązać dzięki dodaniu kilku warunków:

void sortowanieminmax_(int *tab, int rozmiar, int p, int k)

{
	int max, min, j, pom;
	if (k - p >= 0)
	{
		max = p;
		min = p;
		for (j = p; j < k + 1; j++)
		{
			if (tab[j] < tab[min])
			{
				min = j;
			}
			if (tab[j]>tab[max])
			{
				max = j;
			}
		}
		if (max == p && min == k)
		{
			pom = tab[max];
			tab[max] = tab[min];
			tab[min] = pom;
		}
		else if (max == p)
		{
			pom = tab[k];
			tab[k] = tab[max];
			tab[max] = pom;
			pom = tab[p];
			tab[p] = tab[min];
			tab[min] = pom;
		}
		else
		{
			pom = tab[p];
			tab[p] = tab[min];
			tab[min] = pom;
			pom = tab[k];
			tab[k] = tab[max];
			tab[max] = pom;
		}
		p = p + 1;
		k = k - 1;
		sortowanieminmax_(tab, rozmiar, p, k);
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1