Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

c++ Sortowanie Merge na tablice dynamicznych

Ostatnio zmodyfikowano 2017-11-13 18:50
Autor Wiadomość
fifi_xd
Temat założony przez niniejszego użytkownika
c++ Sortowanie Merge na tablice dynamicznych
» 2017-11-13 16:06:40
Witam, mam problem z wysłaniem do funkcji Merge tablicy o dużych rozmiarach. Program nie ma żadnych błędów przy kompilacji. Problem zaczyna się przy uruchamianiu dla tablicy o rozmiarach 1024-262144 działa natomiast dla wyższego rozmiaru wyskakuje błąd " Program przestał działać poprawnie z powodu wystąpienia problemu. System Windows...". Zastanawiałem się, czy może wychodzę poza rozmiar tablicy ale wydaje mi się że nie. Oto mój kod w 3 plikach:
main.cpp
C/C++
#include "m.h"
#include "t.h"

using namespace std;

int main()
{
    ofstream plik( "wynik.txt" );
    for( int i = 1024; i <= 1048576; i = i * 2 ) {
        int * tab = new int[ i ];
        wpisanie( tab, i );
        Merge_Sort( tab, 0, i - 1 );
        cout << i << "\t";
        delete[] tab;
    }
    plik.close();
    return 0;
}
m.h:

C/C++
#ifndef M_H_INCLUDED
#define M_H_INCLUDED
#include <iostream>
#include <algorithm>
#include <limits>
#include <ctime>
#include <cstdlib>
#include <climits>
#include <math.h>
#include <fstream>
#include "ekran.h"
using namespace std;
template < typename T >
void Merge( T * A, int p, int q, int r ) {
    int n1 = q - p + 1;
    int n2 = r - q;
    T L[ n1 + 1 ];
    T R[ n2 + 1 ];
   
    for( int i = 0; i <= n1; i++ ) {
        if( i < n1 ) {
            L[ i ] = A[ p + i ];
        } else {
            L[ i ] = INT_MAX;
        }
    }
   
    for( int j = 0; j <= n2; j++ ) {
        if( j < n2 ) {
            R[ j ] = A[ q + j + 1 ];
        } else {
            R[ j ] = INT_MAX;
        }
       
    }
   
    int i = 0, j = 0;
    for( int k = p; k <= r; k++ )
    {
        if( L[ i ] < R[ j ] )
        {
            A[ k ] = L[ i ];
            i++;
        }
        else {
            A[ k ] = R[ j ];
            j++;
        }
    }
}

template < typename T >
void Merge_Sort( T * A, int p, int r ) {
    int q = 0;
    if( p < r ) {
        q =( p + r ) / 2;
        Merge_Sort( A, p, q );
        Merge_Sort( A, q + 1, r );
        Merge( A, p, q, r );
    }
}
#endif // M_H_INCLUDED
t.h:

C/C++
#ifndef T_H_INCLUDED
#define T_H_INCLUDED
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <limits>
#include <ctime>
#include <cstdlib>
#include <climits>
#include <math.h>
#include <fstream>
using namespace std;

template < typename T >
void wpisanie( T * tablica, int elementy ) {
    for( int i = 0; i < elementy; i++ ) {
        tablica[ i ] = rand();
    }
}
#endif // T_H_INCLUDED
P-166856
mateczek
» 2017-11-13 16:55:56
C/C++
// tak się nie deklaruje tablic o nieznanym rozmiarze.
// zmienne statyczne są na stosie. wielkich tablic nie rzuca się na stos
T L[ n1 + 1 ];
T R[ n2 + 1 ];
P-166857
fifi_xd
Temat założony przez niniejszego użytkownika
» 2017-11-13 18:50:27
dziękuje za odpowiedź. Wszytko działa ;)
P-166858
« 1 »
  Strona 1 z 1