Nadesłany przez Michał W, 14 października 2012 17:34
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
merge.cpp:
// sortowanie przez scalanie (mergesort)
// Wersja rekurencyjna, petla glówna zawiera prosty test dzialania
// Przy scalaniu do pamieci roboczej kopiowana jest tylko jedna z laczonych tablic.
// www.algorytm.org
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
//zamienia miejscami dwie wartosci
void zamien(int & liczba1, int & liczba2)
{
int pamiec = liczba1;
liczba1 = liczba2;
liczba2 = pamiec;
return;
}
//scala tablice
void merge(int T[], int t[], int start, int middle, int end)
{
for(int i = start; i < middle; i++)
t[i - start] = T[i];
int Ti = start;
int i1 = 0;
int i2 = middle;
while ((i1 + start) < middle and i2 < end)
{
if (t[i1] <= T[i2])
T[Ti++] = t[i1++];
else
T[Ti++] = T[i2++];
}
for (i1; (i1 + start) < middle; i1++)
T[Ti++] = t[i1];
return;
}
//sortowanie przez scalanie
//funkcja rekurencyjna - podzial tablicy i ich ponowne scalanie
void mergesort_with_table(int T[], int t[], int start, int end)
{
if (end - start > 2)
{
mergesort_with_table(T, t, start, ((end - start) / 2) + start);
mergesort_with_table(T, t, ((end - start) / 2) + start, end);
merge(T, t, start, ((end - start) / 2) + start, end);
}
else if (end - start == 2)
if (T[start] > T[end - 1])
zamien(T[start], T[end - 1]);
else if (end - start == 1)
return;
}
//sortowanie przez scalanie - punkt wejsciowy do sortowania
void mergesort(int T[], int start, int end)
{
int t[(end - start)/2];
mergesort_with_table(T, t, start, end);
return;
}
//program
int main()
{
// ios_base::sync_with_stdio(0);
srand( time( NULL ) );
int ROZMIAR;
int ZAKRES;
cout << "Podaj rozmiaj tablicy: ";
cin >> ROZMIAR;
cout << "Podaj zakres liczb ( 0 - n ): ";
cin >> ZAKRES;
ZAKRES++;
int T[ROZMIAR];
for (int i = 0; i < ROZMIAR; i++)
T[i] = rand()%ZAKRES;
// for (int i = 0; i < ROZMIAR; i++)
// cout << T[i] << " ";
// cout << endl;
mergesort(T, 0, ROZMIAR);
// for (int i = 0; i < ROZMIAR; i++)
// cout << T[i] << " ";
// cout << endl;
bool test = true;
for (int i = 0; i+1 < ROZMIAR; i++)
if (T[i] > T[i+1])
test = false;
if (test) cout << "OK!"; else cout << "Nie bangla!"; cout << endl;
return 0;
}

