Zbyt wolne sortowania

0

witam muszę wykonać sortowania dla n=10 do 108 i nie wiem czy ja mam jakiś problem z kompilatorem bo przy 106 INSERTIONSORT trwa ponad 10 minut czyli nie ma możliwości aby doszło mi do 108+ nie wiem dlaczego ale po 106 program przechodzi do kolejnego sortu...

#include<iostream>
#include<vector>
#include<random>
#include<chrono>
#include<ctime>
using namespace std;

void selectionsort(vector<unsigned long >&v)
{
	unsigned long  min = 0;
	unsigned long  i, j;
	for (i = 0; i < v.size()/2; i++) {
		for (j = i; j < v.size() - 1; j++) {
			if (v[j + 1] < v[j])
				min = j + 1;
			
		}
		swap(v[i], v[min]);
	}
}

void bubblesort(vector<unsigned long >&v) {
	unsigned long  i, j;
	for(i=0;i<v.size();i++)
		for (j = 1; j<v.size() -i; j++)
			if(v[j-1]>v[j])
				swap(v[j-1], v[j]);
}

void insertionsort(vector<unsigned long >&v) {
	unsigned long  i, j;
	for (i = 1; i< v.size(); i++)
		for (j = i; j>0; j--)
			if (v[j]<v[j-1])
				swap(v[j],v[j - 1]);
}



int main()
{
	unsigned long  i, j;
	vector<unsigned long > v;

	
	cout << "INSERTIONSORT" << endl;
	for (i = 10; i < 100000000; i = i * 10)
	{
		v.resize(i);
		for (j = 0; j < i; ++j)
			v[j] = rand() % i;
		std::chrono::time_point<std::chrono::system_clock> start, end;
		start = std::chrono::system_clock::now();
		insertionsort(v);
		end = std::chrono::system_clock::now();

		std::chrono::duration<long double> elapsed_seconds = end - start;

		std::cout << i << " czas: " << elapsed_seconds.count() << "s\n";

	}
	cout << "BUBBLESORT" << endl;
	for (i = 10; i < 100000000; i = i * 10)
	{
		v.resize(i);
		for (j = 0; j < i; ++j)
			v[j] = rand() % i;
		std::chrono::time_point<std::chrono::system_clock> start, end;
		start = std::chrono::system_clock::now();
		bubblesort(v);
		end = std::chrono::system_clock::now();

		std::chrono::duration<long double> elapsed_seconds = end - start;

		std::cout << i << " czas: " << elapsed_seconds.count() << "s\n";

	}
	cout << "SELECTIONSORT" << endl;
	for (i = 10; i < 100000000; i = i * 10)
	{
		v.resize(i);
		for (j = 0; j < i; ++j)
			v[j] = rand() % i;
		std::chrono::time_point<std::chrono::system_clock> start, end;
		start = std::chrono::system_clock::now();
		selectionsort(v);
		end = std::chrono::system_clock::now();

		std::chrono::duration<long double> elapsed_seconds = end - start;

		std::cout << i << " czas: " << elapsed_seconds.count() << "s\n";

	}

	return 0;
} 
0

Mi wydaje się że jest ok, INSERTIONSORT ma złożoność O(n^2) więc nie jest demonem prędkości

0

No niestety, ale chyba żaden współczesny sprzęt nie da rady obliczyć 5 * 107 sortowań zbioru 5 * 107 w sensownym czasie. Ponieważ złożoność rośnie tutaj O(n3) to możesz spodziewać się że całość wykona się w 8min * (108 / 106)3 = 8min * (100)3 = 8 min * 106 = 15.2 lat.

0

Problemem jest że nawet jak dam cin.precision(20) to i tak dla n=100 mam zero... jak to zmienić?

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