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

Sortowanie przez scalanie

VPS Starter Arubacloud
0 głosów
802 wizyt
pytanie zadane 13 maja 2017 w C i C++ przez Ala123456 Użytkownik (760 p.)
edycja 14 maja 2017 przez Ala123456

#include <iostream>
using namespace std;
 
void merge(int *,int, int , int );
void mergesort(int *A, int p, int k)
{
    int sr;
    if (p < k)
    {
        sr=(p+k)/2;
        mergesort(A,p,k);
        mergesort(A,sr+1,k);
        merge(A,p,k,sr);
    }
     return;
}
void merge(int *A, int p, int k, int sr)
{
    int i, j, m, *c;
    c=new int;
    i = p;
    m = p;
    j = sr + 1;
    while (i <= sr && j <= k)
    {
        if (A[i] < A[j])
        {
            c[m] = A[i];
            m=i+1;
            i=i+1;
        }
        else
        {
            c[m] = A[j];
            m=m+1;
            j=j+1;
        }
    }
    while (i <= sr)
    {
        c[m] = A[i];
        m=m+1;
        i=i+1;
    }
    while (j <= k)
    {
        c[m] = A[j];
        m=m+1;
        j=j+1;
    }
    for (i = p; i < m; i++)
    {
        A[i] = c[i];
    }
}
int main()
{
    int n, *A, *b;
    cout<<"Podaj jaka jest wielkosc zbioru: ";
    cin>>n;
    A =new int [n];
    b=new int;
     
    int i, *c;
    cout<<"Wpisz elementy do posortowania\n";
    for (i = 0; i < n; i++)
    {
        cin>>A[i];
    }
    mergesort(A, 0, n);
    cout<<"Posortowane elementy\n";
    for (i = 0; i < n; i++)
    {
        cout<<A[i]<<"";
    }
    cout<<"Wppisz elementy do posortowania\n";
    for (i = 0; i < n; i++)
    {
       cin>>b[i];
    }
    mergesort(b, 0, n);
    cout<<"Posortowane elementy\n";
    for (i = 0; i < n; i++)
    {
        cout<<b[i]<<"";
    }
     
}

Jest to sortowanie przez scalanie. Niestety nie działa ktoś pomógłby poprawić? Bardzo pilne 

2 odpowiedzi

0 głosów
odpowiedź 13 maja 2017 przez seba Dyskutant (8,900 p.)
Mi działa.
komentarz 14 maja 2017 przez Ala123456 Użytkownik (760 p.)
Wkleiłam zły kod nie ten co trzeba :/ juz jest inny
0 głosów
odpowiedź 14 maja 2017 przez d0n Mądrala (6,440 p.)
edycja 14 maja 2017 przez d0n
  • Program odnosi się do niezaalokowanej pamięci ( wskaźnik b nie dostał przydziału pamięci za pomocą operatora new)
  • For'y napisane w mainie idą od i == 0 do i == n,  a powinny do i == n - 1.
  • Wskaźnik c w funkcji merge nie ma przydzielonej pamięci ( znow brak instrukcji z operatorem new )
  • W funkcji mergesort pierwsze wywolanie rekurencyjne ma zle argumenty ( powinno byc mergesort(A,p,sr); )

Po naprawieniu tych błędów wszystko działa, sugestia, to żeby poprawić w wypisywaniu puste cudzyslowy, na cudzyslowy oddzielone spacja, a po wypisywaniu odpowiedzi wypisac '\n' konczace linie.

1
komentarz 14 maja 2017 przez Ala123456 Użytkownik (760 p.)
Dziękuję pięknie ! Już działa poprawnie.
komentarz 14 maja 2017 przez Ala123456 Użytkownik (760 p.)
edycja 14 maja 2017 przez Ala123456
#include <iostream>
using namespace std;
 
void merge(int *,int, int , int );
void mergesort(int *A, int p, int k)
{
    int sr;
    if (p < k)
    {
        sr=(p+k)/2;
        mergesort(A,p,sr);
        mergesort(A,sr+1,k);
        merge(A,p,k,sr);
    }
     return;
}
void merge(int *A, int p, int k, int sr)
{
    int i, j, m, *c;
    c=new int;
    i = p;
    m = p;
    j = sr + 1;
    while (i <= sr && j <= k)
    {
        if (A[i] < A[j])
        {
            c[m] = A[i];
            m=i+1;
            i=i+1;
        }
        else
        {
            c[m] = A[j];
            m=m+1;
            j=j+1;
        }
    }
    while (i <= sr)
    {
        c[m] = A[i];
        m=m+1;
        i=i+1;
    }
    while (j <= k)
    {
        c[m] = A[j];
        m=m+1;
        j=j+1;
    }
    for (i = p; i < m; i++)
    {
        A[i] = c[i];
    }
}
int main()
{
    int n, *A, *b;
    cout<<"Podaj jaka jest wielkosc zbioru:\n ";
    cin>>n;
    A =new int [n];
    b=new int;
     
    int i, *c;
    cout<<"Wpisz elementy do posortowania\n";
    for (i = 0; i < n; i++)
    {
        cin>>A[i];
    }
    mergesort(A, 0, n);
    cout<<"Posortowane elementy \n";
    for (i = 0; i < n; i++)
    {
        cout<<A[i]<<"\n";
    }
   cout<<"Wpisz elementy do posortowania\n";
    for (i = 0; i < n; i++)
    {
       cin>>b[i];
    }
    mergesort(b, 0, n);
    cout<<"Posortowane elementy\n";
    for (i = 0; i < n; i++)
    {
        cout<<b[i]<<"\n";
    }
} 


Mam jeszcze pytanie bo nie wiem czemu jak wpisuje liczby to pierwsza zamienia mi na 0 :/ reszta jest okey 

komentarz 14 maja 2017 przez d0n Mądrala (6,440 p.)
edycja 14 maja 2017 przez d0n
  • jest b = new int, a powinno byc b = new int [n] ( 62 linijka )
  • jest mergesort( A, 0, n ), a powinno być mergesort( A, 0, n - 1 ) ( 70 linijka i 81 linijka )
  • jest c = new int, a powinno byc c = new int [k + 1] ( 20 linijka )
  • jest m = i + 1, a powinno byc m = m + 1 ( 29 linijka )

Po tych poprawkach powinno być wszystko dobrze, napisze jeszcze krotki skrypt w bashu, ktory posprawdza, czy wszystko sie dobrze sortuje i jak cos bedzie nie tak, to napisze kolejny komenatrz, ale juz powinno byc  w porzadku. Jeszcze w 59 linijce na koncu stringu do wypisania wkradla sie niepotrzebna spacja =)

komentarz 14 maja 2017 przez Ala123456 Użytkownik (760 p.)
Super wszystko :D Dziękuję a jakbyś miał wybrac wazniejsze ok 15 linii kodu i uzasadnic czemu je wybrałes to które bys wybrał? Dla mnie caly kod jest wazny i nie jestem pewna co do wyboru

Podobne pytania

0 głosów
1 odpowiedź 371 wizyt
0 głosów
2 odpowiedzi 719 wizyt
+1 głos
1 odpowiedź 796 wizyt
pytanie zadane 5 czerwca 2017 w C i C++ przez mazak12 Nowicjusz (150 p.)

92,832 zapytań

141,777 odpowiedzi

320,824 komentarzy

62,164 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

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!

...