Sortowanie w c++- losowanie dużej liczby elementów

0

Witajcie,
nie wiedziałem czy napisać tu czy w początkujących, ale chyba tu szybciej mi ktoś pomoże, mam taki problem potrzebuje wylosować 256k elementów struktury, a nawet więcej do analizy algorytmów sortowania, jednak jak możecie się domyślić program wykłada się przy losowaniu tylu elementów. Domyślam się, że chodzi tu o dynamiczną alokacje pamięci, jednak nie do końca wiem jak się za to zabrać. Jakieś wskazówki?

const long int iloscElementow=50000;

using namespace std;

struct ulamki
{
	float licznik;
	float mianownik;
};

void losuj(ulamki zbior[])
{
	int i=0;
	srand( time( NULL ) );
	for(i=0;i<iloscElementow;++i)
	{
		zbior[i].licznik=rand();
		zbior[i].mianownik=rand();

	}
	cout<<"Wylosowano "<<iloscElementow<<" elementow"<<endl;

}

I jak ustawie np 100 tysiecy, to się wyłoży i to jest mój problem.

1

Pokazać to co ci się wykłada

0

jednak jak możecie się domyślić program wykłada się przy losowaniu tylu elementów.
Niby dlaczego mielibyśmy się tego domyślić? Losowanie nie działa dla dokładnie 256k obiektow, czy jak? Ktoś napisał, ze nie mamy jescze atestu na nasze magiczne kule na ten rok...

0

Przepraszam, już się doprecyzowałem. Wszystko w pierwszym poście.

0
  1. srand( time( NULL ) ); zrób jeden raz w main
  2. Nie rób żadnych wydruków w losuj()
  3. Przekaż rozmiar tablicy do losuj()
  4. Wszystko wyżej to tylko sugestie, błąd leży tam gdzie wywołujesz tą funkcje, podejrzewam ze nie przydzielasz pamięci.
1

Dlaczego mianownik i licznik są zmiennoprzecinkowe? Nie lepiej wtedy użyć standardowego double zamiast całego structa?

0
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <time.h>
const int iloscElementow=50000;

using namespace std;

struct ulamki
{
    float licznik;
    float mianownik;
};
 
void losuj(ulamki zbior[])
{
    int i=0;
    srand( time( NULL ) );
    for(i=0;i<iloscElementow;++i)
    {
        zbior[i].licznik=rand();
        zbior[i].mianownik=rand();
 
    }
    }


void BubbleSort(float *t, int n)
{
   int i,j;
   float temp;
   bool czy_posortowana = true;
 
   for (j=0;j<n-1;j++){
      czy_posortowana = true;
      for (i=0;i<n-1-j;i++)
         if (t[i]>t[i+1])
         {
            czy_posortowana = false;
            temp = t[i+1]; 
            t[i+1] = t[i];
            t[i] = temp;
         }  
         if (czy_posortowana == true) return;
   }
}
 



int _tmain(int argc, _TCHAR* argv[])
{
	int i;
	float dane[iloscElementow];
	ulamki zbior[iloscElementow];
	losuj(zbior);
	for(i=0;i<iloscElementow;++i)
	{
		dane[i]=zbior[i].licznik/zbior[i].mianownik;		
	}

	int start = clock();
	BubbleSort(dane,iloscElementow);
	int koniec =clock() - start;
	cout<<"Bubblesort dla "<<iloscElementow<<" trwal "<<koniec<<" ms"<<endl;

	return 0;
}

1

No to prosta sprawa. Zamiast trzymać elementy na stosie użyj klasy std::vector.

2
  1. static float dane[iloscElementow]; lub jako zmienna globalna lub vector
  2. static ulamki zbior[iloscElementow]; lub jako zmienna globalna lub vector
  3. dane[i]=zbior[i].licznik/zbior[i].mianownik; - cholera nie dziel przez zero
  4. clock() - nie jest w ms
  5. Jak chcesz wylosować wartość zmiennoprzecinkową to zrób to po ludzku rand()/(RAND_MAX+1.)*MAX;
0

Jak widać, dużo jeszcze przede mną jeżeli chodzi o programowanie. Niemniej dziękuje bardzo, za pomoc. Pozdrawiam

0

Mam jeszcze jeden problem, mianowicie to jest mój kod http://pastebin.com/vcJGdLWG (trochę długi dlatego z linka). I muszę go przerobić, tzn zrobić go bardziej elastycznym, tzn żeby sortowania nie były stricte pod ułamki. Więc wymyśliłem sobie żeby zrobić funkcje, która porównywała by dwa ułamki(a w razie potrzeby cokolwiek innego), a sortowania odbywało by się na podstawie tego co zwróci funkcja. Wymyśliłem coś takiego i wszystko wydaje się być okej, wszystko poza QuickSortem. Przejrzałem to w debuggerze i wydaje się, że po prostu w pewnym momencie zapętla się i dostaje "stack overflow".

 
bool porownaj(ulamek u1, ulamek u2)
{
	float a=u1.licznik/u1.mianownik;
	float b=u2.licznik/u2.mianownik;
	

	if (a>b) return true;
	else return false;
}

I tym chciałem zastąpić porównania czyli np. zamiast (wynik(tempTab[j])>wynik(tempTab[i])) napisać (porownaj(tempTab[j],tempTab[i])==true).

0

Mi działa, tylko zamiast przekazywać do funkcji

ulamek

napisalem sobie ulamki

.
0

Problem rozwiazany, problem leżął w while'ach w Quick sorcie.

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