Problem z kodem, dwie metody sortujące

0

Witam. Mam problem z kodem. Potrzebuje programu który posortuje mi tablicę dwoma metodami i wypiszę czas sortowania.
Tylko coś mi nie bardzo chce działać. Pierwszy problem miałem z printf/scanf na visualu, ale z tym poradziłem sobie dając w ustawieniach SDL checks > NO
Drugi problem zaczyna mi się z czasami. Nie liczy mi ich.

Proszę o wybaczenie, ale nie jestem dobry w C++ :(

#include <iostream>
#include <time.h>
#include <windows.h>
using namespace std;
int ile;
clock_t start, stop;
double czas;
double czaslicz1;
double czaslicz2;

void sortowanie_babelkowe(int* tab, int n)
{
	for (int i = 1; i < n; i++)
	{
		for (int j = n - 1; j >= 1; j--)
		{
			if (tab[j] < tab[j - 1])
			{
				swap(tab[j], tab[j - 1]);
			}
		}
	}
}

void sortowanie_kopcowe(int* tablica, int rozmiar)
{
	int i, j;
	for (int m = 2; m <= rozmiar; m++)
	{
		i = m;
		j = i / 2;
		while ((tablica[i] > tablica[j]) && (j > 0))
		{
			swap(tablica[i], tablica[j]);
			i = j;
			j = i / 2;
		}
	}
}
int main()
{
	printf("Porownanie czasow sortowania \nUwaga pierwsza tablica zostanie wyswietlona oraz efekt sortowania\nTablice zostana wylosowane z liczb od 1 do 100000\n\n");
		
		for (int c = 1; c < 5; c++)
		{
			printf("Podaj wielkosc tablicy: %d ", c);
			scanf("%d", &ile);
			
			int* tablica;
			tablica = new int[ile];

			int* tablica2;
			tablica2 = new int[ile];

			srand(time(NULL));
			for (int i = 0; i < ile; i++)
			{
				tablica[i] = rand() % 100000 + 1;
			}
			
			for (int i = 0; i < ile; i++)
			{
				tablica2[i] = tablica[i];
			}

			if (c == 1)
			{
				printf("\nTabela przed posortowaniem \n");
				for (int i = 0; i < ile; i++)
				{
					cout << tablica[i] << " ";
				}
			}

			printf("\n\n\nSortowanie babelkowe...\n");
			start = clock();
			sortowanie_babelkowe(tablica, ile);
			stop = clock();
			czas = (double)(stop - start) / CLOCKS_PER_SEC;
			printf("\nCzas sortowania babelkowego: %f", czas, "s\n");
			czaslicz1 += czas;
			
			if (c == 1)
			{
				printf("\nTabela po sortowaniu babelkowym: \n");
				for (int i = 0; i < ile; i++)
				{
					cout << tablica[i] << " ";
				}
			}

			printf("\n\n\nSortowanie kopcowe...\n");
			start = clock();
			sortowanie_kopcowe(tablica2, ile);
			stop = clock();
			czas = (double)(stop - start) / CLOCKS_PER_SEC;
			printf("\nCzas sortowania kopcowego: %f", czas, "s\n");

			czaslicz2 += czas;
			if (c == 1)
			{
				printf("\nTabela po sortowaniu kopcowym \n");
				for (int i = 0; i < ile; i++)
				{
					cout << tablica[i] << " ";
				}
			}
			printf("\n\n\n");
			delete[] tablica;
			delete[] tablica2;
			if (c == 4)
			{

				printf("Sredni czas sortowania metoda babelkowego wszystkich tabel to: %f \n", czaslicz1 / 4);
				printf("Sredni czas sortowania metoda kopcowe wszystkich tabel to: %f \n", czaslicz2 / 4);
			}
		}
	return 0;
}
2
  • wartość zwracana przez clock ma słaba rozdzielczość czasową. Potrzeba naprawdę dużych danych, żeby pomiar miał sens. Możesz spróbować z std::chrono, albo bardziej ambitnie google benchmark.
  • oczami wyobraźni domyślam się, że test puszczasz po zbudowaniu w konfiguracji Debug (powszechny błąd początkującego).
  • podziel kod z main na mniejsze funkcje
    • generujDane
    • pomierzCzasWykonania
    • wyswietWynik
    • ....

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