Cześć.
Mam zadanie napisać program, który z pliku .txt będzie pobierać spis nazwisk. Następnie przy pomocy algorytmu sortowanie pozycyjne posortuje mi te nazwiska alfabetycznie. Napisałem kod, który powinien to zadanie wykonać, jednak niezależnie od tego ile nazwisk ma do posortowania następuje zrzut pamięci.
Problem ten zawsze występuje podczas 4/5/6 obiegu pętli w radixSort.
Byłbym wdzięczny za pomoc.
#include <iostream>
#include <ctime>
#include <string>
#include <time.h>
#include <cstdlib>
#include <fstream>
#include <cstdio>
using namespace std;
///////////////////////////////////////////////////////////////////////////////////////////////
void countSort(string wyrazy[], int n, int exp, int c) //n - maksymalna ilosc wyrazów,
// m - pozycja literki
{
string *output = new string[n]; // output array
int i, count[10] = {0};
// Store count of occurrences in count[]
for (i = 0; i < n; i++)
count[ (((int)wyrazy[i][c])/exp)%10 ]++;
// Change count[i] so that count[i] now contains actual
// position of this digit in output[]
for (i = 1; i < 10; i++)
count[i] += count[i - 1];
// Budowanie tablicy pomocniczej
for (i = n - 1; i >= 0; i--)
{
output[count[ (((int)wyrazy[i][c])/exp)%10 ] - 1] = wyrazy[i];
count[ ((int)wyrazy[i][c]/exp)%10 ]--;
}
//Kopiowanie z tablicy pomocnicznej do głównej
for (i = 0; i < n; i++)
{
wyrazy[i] = output[i];
}
cout << "Skonczylem countSort" << "\n";
delete [] output;
}
void radixSort(string wyrazy[], int n, int c)//c - numer literki według ktorej sortujemy
{
cout << "Zaczalem radixSort" << "\n";
int m = 122;//getMax(wyrazy,n,c); //Bedzie liczyć dla pierwszej literki;
for (int exp = 1; m/exp > 0; exp *= 10)
{
countSort(wyrazy, n, exp, c);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
int n = 30; // Wybieramy ile nazwisk z pliku nazwiskaASCII ma zostać posortowanych
int popularnosc;
string *wyrazy = new string[n];//ilosc wszystkich wyrazow
clock_t s1,s2,f1,f2;
double czas1, czas2 = 0;
fstream plik;
plik.open( "nazwiskaASCII.txt", ios::in);
if( plik.good() == true )
{
cout << "Uzyskano dostep do pliku!" << endl;
for(int i = 0; i < n; i++)
{
plik >> popularnosc;
getline(plik, wyrazy[i],'\n');
cout << wyrazy[i] << endl;
}
plik.close();
cout << "Skonczylem ladowanie nazwisk" << "\n";
}
else cout << "Dostep do pliku zostal zabroniony!" << endl;
///////////////////////////////////////////////////////////////////////////////////////////////
for(int i = 20; i > 0; i--) //Sortowanie od tyłu nazwisk - RadixSort
{
radixSort(wyrazy,n,i);
}
cout << "Skonczylem radixsort" << "\n";
///////////////////////////////////////////////////////////////////////////////////////////////
return 0;
delete [] wyrazy;
}