• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z algorytmem sortowania

Object Storage Arubacloud
0 głosów
195 wizyt
pytanie zadane 6 czerwca 2015 w C i C++ przez Cso Nowicjusz (170 p.)
edycja 7 czerwca 2015 przez Cso

Mój problem polega na tym iż porogram się sypie przy próbie użycia Merge sorta. Mam wrażenie że dla pomniejszych danych sortowanie poprzez scalanie działa prawidłowo,  zaś przy większych danych  program  wyświetla błąd. 

#include<iostream>
#include<cstdlib>
#include<time.h>
#include<windows.h>
using namespace std;
clock_t start,stop;
double czas;
void merge(int tablica[], int start, int srodek, int koniec)
{
	int *tab_pom = new int[(koniec-start)]; // utworzenie tablicy pomocniczej
	int i = start, j = srodek+1, k = 0; // zmienne pomocnicze

	while (i <= srodek && j <= koniec)
	{
		if (tablica[j] < tablica[i])
		{
			tab_pom[k] = tablica[j];
			j++;
		}
		else
		{
			tab_pom[k] = tablica[i];
			i++;
		}
		k++;
	}

	if (i <= srodek)
	{
		while (i <= srodek)
		{
			tab_pom[k] = tablica[i];
			i++;
			k++;
		}
	}
	else
	{
		 while (j <= koniec)
		 {
			  tab_pom[k] = tablica[j];
			  j++;
			  k++;
		 }
	}

	for (i = 0; i <= koniec-start; i++)
		tablica[start+i] = tab_pom[i];

}

void merge_sort(int tablica[], int start, int koniec)
{
	int srodek;

	if (start != koniec)
	{
		srodek = (start + koniec)/2;
		merge_sort(tablica, start, srodek);
		merge_sort(tablica, srodek+1, koniec);
		merge(tablica, start, srodek, koniec);
	}
}

void heapify (int *tab, int heap_size, int i)
{
int largest, temp;
int l=2*i, r=(2*i)+1;
if (l<=heap_size && tab[l]>tab[i])
largest=l;
else largest=i;
if (r<=heap_size && tab[r]>tab[largest])
largest=r;
if (largest!=i)
{
temp=tab[largest];
tab[largest]=tab[i];
tab[i]=temp;
heapify(tab,heap_size,largest);
}
}
void budKopiec(int *tab, int rozmiar)
{
for (int i=rozmiar/2;i>0;i--)
heapify(tab,rozmiar, i);
}

void sort(int *tab, int rozmiar)
{
int temp;
budKopiec(tab, rozmiar);
for (int i=rozmiar;i>1;i--)
{
temp=tab[i];
tab[i]=tab[1];
tab[1]=temp;
rozmiar--;
heapify(tab,rozmiar,1);
}
}
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])
            {
                int bufor;
                bufor=tab[j-1];
                tab[j-1]=tab[j];
                tab[j]=bufor;
            }
        }
    }
}

int partition(int tablica[], int p, int r) // dzielimy tablice na dwie czesci, w pierwszej wszystkie liczby sa mniejsze badz rowne x, w drugiej wieksze lub rowne od x
{
	int x = tablica[p]; // obieramy x
	int i = p, j = r, w; // i, j - indeksy w tabeli
	while (true) // petla nieskonczona - wychodzimy z niej tylko przez return j
	{
		while (tablica[j] > x) // dopoki elementy sa wieksze od x
			j--;
		while (tablica[i] < x) // dopoki elementy sa mniejsze od x
			i++;
		if (i < j) // zamieniamy miejscami gdy i < j
		{
			w = tablica[i];
			tablica[i] = tablica[j];
			tablica[j] = w;
			i++;
			j--;
		}
		else // gdy i >= j zwracamy j jako punkt podzialu tablicy
			return j;
	}
}

void quicksort(int tablica[], int p, int r) // sortowanie szybkie
{
	int q;
	if (p < r)
	{
		q = partition(tablica,p,r); // dzielimy tablice na dwie czesci; q oznacza punkt podzialu
		quicksort(tablica, p, q); // wywolujemy rekurencyjnie quicksort dla pierwszej czesci tablicy
		quicksort(tablica, q+1, r); // wywolujemy rekurencyjnie quicksort dla drugiej czesci tablicy
	}
}

int main()
{
const int N = 20;  // liczebnoϾ zbioru
int d[N + 1],i,j,k,m,x;

	int ilosc_liczb;
	cout << "Podaj ilosc licz do posortowania: ";
	cin >> ilosc_liczb;
	int *tablica = new int  [ilosc_liczb];// utworzenie dynamicznej tablicy na 'ilosc_liczb' elementow
	int *tablica2 = new int [ilosc_liczb];
	int *tablica3 = new int [ilosc_liczb];
	int *tablica4 = new int [ilosc_liczb];
       srand(time(NULL));
	for (i = 0; i < ilosc_liczb; i++) // wczytywanie liczb do tablicy
	{
        tablica[i]= rand()%10000+1;

	}
	start= clock();
	quicksort(tablica,0,ilosc_liczb-1);
	stop=  clock();
	czas = (double)(stop-start) / CLOCKS_PER_SEC;
	cout<<"Czas quicksort "<<"s "<<czas<<endl;
	for (i = 0; i < ilosc_liczb; i++) // wczytywanie liczb do tablicy
	{
        tablica2[i]= tablica[i];

	}
    start=clock();
    sortowanie_babelkowe( tablica2,ilosc_liczb);
    stop= clock ();
    czas=(double)(stop-start)/CLOCKS_PER_SEC;
    cout<<"Czas sortowania bombelkowego "<<"s "<<czas<<endl;
    for (i = 0; i < ilosc_liczb; i++) // wczytywanie liczb do tablicy
	{
        tablica3[i]= tablica2[i];

	}
	start= clock();
	sort (tablica3,ilosc_liczb);
	stop=  clock();
	czas = (double)(stop-start) / CLOCKS_PER_SEC;
	cout<<"Czas kopca "<<"s "<<czas<<endl;
	for (i = 0; i < ilosc_liczb; i++) // wczytywanie liczb do tablicy
	{
        tablica4[i]= tablica3[i];

	}
	start= clock();
	merge_sort(tablica4, 0,ilosc_liczb-1);
	stop= clock();
	czas= (double)(stop-start) / CLOCKS_PER_SEC;
	cout<<"Czas Merge sorta "<<"s "<<czas<<endl;

	delete [] tablica;
	delete [] tablica2;
	delete [] tablica3;
	delete [] tablica4;// zwolnienie tablicy zaalokowanej dynamicznie

    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 8 czerwca 2015 przez Bondrusiek Maniak (61,370 p.)
wybrane 8 czerwca 2015 przez Cso
 
Najlepsza

Prawdopodobnie masz błąd w funkcji merge_sort(....)

Usunełem za pomocą komentarzy kod w main():

// start= clock();
   // merge_sort(tablica4, 0,ilosc_liczb-1);
   // stop= clock();
   // czas= (double)(stop-start) / CLOCKS_PER_SEC;
   // cout<<"Czas Merge sorta "<<"s "<<czas<<endl;

i program działa bez zarzutu.

0 głosów
odpowiedź 7 czerwca 2015 przez Dash Nałogowiec (29,650 p.)
Jaki błąd wywala?
komentarz 7 czerwca 2015 przez Cso Nowicjusz (170 p.)
Dokładnie to :

Once 00B30FD0 IS 4 lub zwykly komunikat mowiący o tym,  że dany program przestał działać.

Podobne pytania

0 głosów
1 odpowiedź 88 wizyt
pytanie zadane 11 sierpnia 2020 w C i C++ przez PirchHD Obywatel (1,730 p.)
0 głosów
0 odpowiedzi 170 wizyt
0 głosów
0 odpowiedzi 161 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...