Sortowanie QuickSort liczb z pliku.

0

Witam,

Mam takie zadanie:

Dane wczytywane są z pliku, pierwsza linia wejścia zawiera liczbę całkowitą z - liczbę zestawów danych, których opisy występują kolejno po sobie. Opis jednego zestawu jest następujący:

Pierwsza linia zawiera liczbę naturalną n, określającą długość tablicy T. W kolejnej linii znajduje się n elementów tablicy, oddzielonych pojedynczym odstępem.

Dla każdego zestawu danych wypisz w jednej linii pooddzielany spacjami posortowany ciąg rosnąco.

Przykładowa zawartość pliku to np.

2
3
3 1 2
4
0 5 1 7

Napisałem taki kod:

#include <iostream>
#include <fstream>
#include <string> 
 
using namespace std;
 
 
int partition(int tablica[], int p, int r) // dzielimy tablice na dwie czesci, w pierwszej wszystkie liczby sa mniejsze badz rowne x, w drugiej wieksze lub rowne od x
{
int x = tablica[p]; // obieramy x
int i = p, j = r, w; // i, j - indeksy w tabeli
 
    while (true) // petla nieskonczona - wychodzimy z niej tylko przez return j
    {
        while (tablica[j] > x) // dopoki elementy sa wieksze od x
            j--;

        while (tablica[i] < x) // dopoki elementy sa mniejsze od x
            i++;

        if (i < j) // zamieniamy miejscami gdy i < j
        {
            w = tablica[i];
            tablica[i] = tablica[j];
            tablica[j] = w;
            i++;
            j--;
        }
        else // gdy i >= j zwracamy j jako punkt podzialu tablicy
            return j;
    }
}

void quicksort(int tablica[], int p, int r) // sortowanie szybkie
{
    int q;

    if (p < r)
    {  
        q = partition(tablica,p,r); // dzielimy tablice na dwie czesci; q oznacza punkt podzialu
        quicksort(tablica, p, q); // wywolujemy rekurencyjnie quicksort dla pierwszej czesci tablicy
        quicksort(tablica, q+1, r); // wywolujemy rekurencyjnie quicksort dla drugiej czesci tablicy
    }
}

void otworz(ifstream &file)
{
    while(true) //Pętla wykonuje się do momentu otwarcia pliku
    {
        string nazwa_pliku;
 
        cout << "Podaj nazwe pliku : ";      
        getline(cin,nazwa_pliku); //pobranie nazwy pliku
 
        //sprawdzamy czy użytkownik podał nazwe z rozszerzeniem, jeżeli nie to dopisujemy do nazwy *.txt
        file.open(nazwa_pliku.c_str());

        if(file.is_open())
            return; 
 
        file.open((nazwa_pliku+".txt").c_str()); 

        if(file.is_open())
          return;
 
        //Jeżeli użytkownik podał nieprawidłową nazwę pliku zwracamy komunikat
        cout<<"Podana nazwa pliku jest nieprawidłowa! Plik nie istnieje"<<endl;
    }
}

void iloscciagow(ifstream &file, int &z)
{
    file >> z;
}

int *wczytaj(ifstream &file, int &n)
{
    int i;
    int *Tablica;
 
    file >> n;
    Tablica = new int [n-1];
 
    for (i=0; i<=n-1; i++)
    {
        file >> Tablica[i]; 
        cout<<Tablica[i]<< " ";
    };

    cout<<endl; 
    return Tablica;
}
 
int main()
{
    ifstream plik;
    int a,b,n;
 
    otworz(plik);
    iloscciagow(plik,b);
    cout<<b<<endl;

    for (a=0; a<=b-1; a++)
    {
        wczytaj(plik,n);        
        quicksort(wczytaj(plik,n),0,n-1);
    };
 
    getchar();
    return 0;
}

Otwiera plik, wczytuje oba ciągi poprawnie, ale po dołączeniu funkcji quicksort do pętli dostaje dwa wiersze po 4 losowe wartości. Nie mogę się doszukać błędu. Mógłby ktoś pomóc?

Z góry dziękuje za pomoc,

0

Postaraj się następnym razem sformatować kod przez wklejeniem go do posta; Poza tym, przed jego wysłaniem odwiedź zakładkę Podgląd i jesli wcięcia są zbyt wielkie i linie kodu są zawijane - wklej kod np. do Notatnika, po czym zmniejsz je (zamień wszystkie ciągi po osiem spacji na np. cztery i gotowe).

0

nie lepiej użyć std::sort(jest szybszy od qsorta) w treści zadania nie ma żeby napisać własną funkcję sortującą

0

Pominąłem tą część zadania, przepraszam. Muszę użyć quicksort'a jako funkcje sortującą. Nie mam tutaj żadnego pola do manewru.

0

na szybko znalezione:

    Tablica = new int [n-1];
 
    for (i=0; i<=n-1; i++)
    {
0

Mógłbyś bardziej rozwinąć w którym miejscu jest błąd? Z tego co przetestowałem to sama funkcja wczytaj działała mi poprawnie. Ewentualnie o ile to możliwe, konkretną instrukcję co mam poprawić.

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