Implementacja algorytmu sortowania przez scalanie – ocena rozwiązania zadania

0

Zaimplementuj algorytm sortowania przez scalanie (wersja algorytmu prezentowana na wykładzie) z użyciem
plików tekstowych, w pliku wejściowym (do posortowania) każda liczba znajduje się w osobnym wierszu.
Może być takie rozwiązanie tego zadania? No nie wiem do końca jak to zrobić żeby wszytko poprawnie działało bo wypisuje to z pliku a nie chce mi sortować
a w pilku to napisałem tak

1
2
3
4
5
6
7
#include<iostream>
#include<cstdlib>
#include<fstream>
using namespace std;


int main()
{
    string linia;
    fstream plik;

    plik.open("dane.txt", ios::in);
    if(plik.good() == true)
    {
        while(!plik.eof())
        {
            getline(plik, linia);
            cout << linia << endl;

    }
    }
void scal(int linia[], int lewy, int srodek, int prawy)
{
	int i = lewy, j = srodek + 1;


  for(int i = lewy;i<=prawy; i++)
    pom[i] = linia[i];


  for(int k=lewy;k<=prawy;k++)
  if(i<=srodek)
    if(j <= prawy)
         if(pom[j]<pom[i])
             linia[k] = pom[j++];
         else
             linia[k] = pom[i++];
    else
        linia[k] = pom[i++];
  else
      linia[k] = pom[j++];
}

void sortscalanie(int linia[],int lewy, int prawy)
{

	if(prawy<=lewy) return;


	int srodek = (prawy+lewy)/2;


	sortscalanie(linia, lewy, srodek);
	sortscalanie(linia srodek+1, prawy);


	scal(linia, lewy, srodek, prawy);
}


int n;
for(int i=0;i<n;i++)
		cin>>linia[i];


	sortscalanie(linia,0,n-1);


	for(int i=0;i<n;i++)
		cout<<linia[i]<<" ";
return 0;
    }
0

Gdzie jest zadeklarowana tablica pom?

0

Tak to wygląda

#include<iostream>

#include<fstream>
using namespace std;


int main()
{
    string linia;
    fstream plik;

    plik.open("dane.txt", ios::in);
    if(plik.good() == true)
    {
        while(!plik.eof())
        {
            getline(plik, linia);
            cout << linia << endl;


    }
    }
    }
void scal(int linia[], int lewy, int srodek, int prawy, int pom)
{
	int i = lewy, j = srodek + 1;


  for(int i = lewy;i<=prawy; i++)
    pom[i] = linia[i];


  for(int k=lewy;k<=prawy;k++)
  if(i<=srodek)
    if(j <= prawy)
         if(pom[j]<pom[i])
             linia[k] = pom[j++];
         else
             linia[k] = pom[i++];
    else
        linia[k] = pom[i++];
  else
      linia[k] = pom[j++];
}

void sortscalanie(int linia[],int lewy, int prawy)
{

	if(prawy<=lewy) return;


	int srodek = (prawy+lewy)/2;


	sortscalanie(linia, lewy, srodek);
	sortscalanie(linia srodek+1, prawy);


	scal(linia, lewy, srodek, prawy);
}


int n;
for(int i=0;i<n;i++)
		cin>>linia[i];


	sortscalanie(linia,0,n-1);


	for(int i=0;i<n;i++)
		cout<<linia[i]<<" ";
return 0;
    }

Co zmienić, żeby działało poprawnie?

0

Tu :
http://jeffe.cs.illinois.edu/teaching/algorithms/
W dziale recursion jest mergesort, Przepisz I bedzie dzialac.

0

W którym miejscu zamiast sortowania przez scalanie?

void sortscalanie(int linia[],int lewy, int prawy)
{
 
    if(prawy<=lewy) return;
 
    int srodek = (prawy+lewy)/2;
 
    sortscalanie(linia, lewy, srodek);
    sortscalanie(linia srodek+1, prawy);
 
    scal(linia, lewy, srodek, prawy);
}
 
int n;
for(int i=0;i<n;i++)
        cin>>linia[i];
 
    sortscalanie(linia,0,n-1);

tu?

0

Tak to ma być?

#include<iostream>

#include<fstream>
using namespace std;


int main()
{
    string linia;
    fstream plik;

    plik.open("dane.txt", ios::in);
    if(plik.good() == true)
    {
        while(!plik.eof())
        {
            getline(plik, linia);
            cout << linia << endl;


    }
    }
    }
void scal(int linia[], int lewy, int srodek, int prawy, int pom)
{
	int i = lewy, j = srodek + 1;


  for(int i = lewy;i<=prawy; i++)
    pom[i] = linia[i];


  for(int k=lewy;k<=prawy;k++)
  if(i<=srodek)
    if(j <= prawy)
         if(pom[j]<pom[i])
             linia[k] = pom[j++];
         else
             linia[k] = pom[i++];
    else
        linia[k] = pom[i++];
  else
      linia[k] = pom[j++];
}

Merge(A[1 .. n], m):
i ← 1; j ← m + 1
for k ← 1 to n
if j > n
linia[k] ← pom[i]; i ← i + 1
else if i > m
linia[k] ← pom[ j]; j ← j + 1
else if pom[i] < pom[ j]
linia[k] ← pom[i]; i ← i + 1
else
linia[k] ← pom[ j]; j ← j + 1
for k ← 1 to n
linia[k] ← pom[k]


int n;
for(int i=0;i<n;i++)
		cin>>linia[i];


	sortscalanie(linia,0,n-1);


	for(int i=0;i<n;i++)
		cout<<linia[i]<<" ";
return 0;
    }

0

Właśnie nie tak jakbym chciał

1 użytkowników online, w tym zalogowanych: 0, gości: 1