Funkcja rekurencyjna - sortowanie tablic , sortowanie szybkie rekurencja

0

1.
a) Napisz funkcję rekurencyjną realizującą sortowanie tablicy liczbowej przez scalanie: void ScalanieSort(int A[], int lewy, int prawy) gdzie lewy i prawy oznaczają indeksy ograniczające sortowany fragment tablicy A.
b) Napisz program, który posortuje niemalejąco tablicę n-elementową.
c) Uzupełnij program tak, aby podał liczbę rekurencyjnych wywołań funkcji ScalanieSort przy sortowaniu tablicy n-elementowej (pierwsze wywołanie, dla całej tablicy, ma postać: ScalanieSort(A, 0, n-1)).

Wejście
Pierwszy wiersz standardowego wejścia zawiera jedną liczbę całkowitą dodatnią Z określającą liczbę testów. Pierwszy wiersz każdego testu zawiera liczbę całkowitą dodatnią ni (1 <= ni <= 1000) określającą liczbę elementów ciągu do posortowania. Elementy te, liczby całkowite z przedziału [-10^6 ; 10^6 ] oddzielone pojedynczymi spacjami, podane są w drugim wierszu testu.

Wyjście
Standardowe wyjście powinno zawierać po dwa wiersze odpowiedzi dla każdego testu. Pierwszy wiersz powinien zawierać oddzielone pojedynczymi spacjami posortowane niemalejąco liczby podane na wejściu. Drugi wiersz powinien zawierać informację o liczbie wywołań funkcji ScalanieSort w poniższym formacie:
Liczba wywolan funkcji ScalanieSort = xx

Przykład
Dla danych:
2
10
8 3 4 2 9 0 1 7 6 5
6
123 88 331 647 1967 -753

Poprawny wynik może mieć postać
0 1 2 3 4 5 6 7 8 9
Liczba wywolan funkcji ScalanieSort = 19
-753 88 123 331 647 1967
Liczba wywolan funkcji ScalanieSort = 11

2.
a) Napisz funkcję rekurencyjną realizującą sortowanie szybkie:
void QuickSort(int A[], int lewy, int prawy)
gdzie lewy i prawy oznaczają indeksy ograniczające sortowany fragment tablicy A.
b) Napisz program, który posortuje niemalejąco tablicę n-elementową.
c) Uzupełnij program tak, aby podał liczbę rekurencyjnych wywołań funkcji QuickSort przy sortowaniu tablicy n-elementowej (pierwsze wywołanie, dla całej tablicy, ma postać: QuickSort(A, 0, n-1)).

Wejście
Pierwszy wiersz standardowego wejścia zawiera jedną liczbę całkowitą dodatnią Z określającą liczbę testów. Pierwszy wiersz każdego testu zawiera liczbę całkowitą dodatnią ni (1 <= ni <= 1000) określającą liczbę elementów ciągu do posortowania. Elementy te, liczby całkowite z przedziału [-10^6 ; 10^6 ] oddzielone pojedynczymi spacjami, podane są w drugim wierszu testu.

Wyjście
Standardowe wyjście powinno zawierać po dwa wiersze odpowiedzi dla każdego testu. Pierwszy wiersz powinien zawierać oddzielone pojedynczymi spacjami posortowane niemalejąco liczby podane na wejściu. Drugi wiersz powinien zawierać informację o liczbie wywołań funkcji QuickSort w poniższym formacie:
Liczba wywolan funkcji QuickSort = xx

Przykład
Dla danych:
2
10
8 3 4 2 9 0 1 7 6 5
6
123 88 331 647 1967 -753

Poprawny wynik może mieć postać
0 1 2 3 4 5 6 7 8 9
Liczba wywolan funkcji QuickSort = 19
-753 88 123 331 647 1967
Liczba wywolan funkcji QuickSort = 11

2

Bardzo fajne zadanie, dobre dla początkujących.
Tak a propos, wydaje mi się że zapomniałeś umieścić pytanie.

0

Tak racja nie zadałem pytania przepraszam.
Jestem początkującym w c++ i dokładnie nie wiem jak zacząć te zadania jak potem je ciągnąć dalej. Szukałem trochę choć podobnego zadania chociaż nie powiem, że nie znalazłem.

3

To zadanie to maksimum 30 wierszy, przy tak małych zadaniach nie ma rozpoczęcia czy zakończenia, siadasz i piszesz całość na raz.
Z cym masz problem?

0

Problem polega w każdym zadaniu jak zmienić zawartość tzn. mam dane jakie mam wstawić natomiast mam liczby losowe w kodzie (poniżej wyślę). Czy to wystarczy podmienić czy trzeba raczej większość zmienić ? Jeżeli podmienić to pytanie teraz gdzie ?

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>

using namespace std;

const int N = 20;

int d[N];

void Sortuj_szybko(int lewy, int prawy)
{
    int i, j, piwot;

    i = (lewy + prawy) / 2;
    piwot = d[i]; d[i] = d[prawy];
    for (j = i = lewy; i < prawy; i++)
        if (d[i] < piwot)
        {
            swap(d[i], d[j]);
            j++;
        }
    d[prawy] = d[j]; d[j] = piwot;
    if (lewy < j - 1)  Sortuj_szybko(lewy, j - 1);
    if (j + 1 < prawy) Sortuj_szybko(j + 1, prawy);
}

int main()
{
    int i;

    srand((unsigned)time(NULL));

    cout << "   Sortowanie szybkie\n"
        "------------------------\n"
        " (C)2005 Jerzy Walaszek \n\n"
        "Przed sortowaniem:\n\n";

    for (i = 0; i < N; i++) d[i] = rand() % 100;
    for (i = 0; i < N; i++) cout << setw(4) << d[i];
    cout << endl;

    Sortuj_szybko(0, N - 1);

    cout << "Po sortowaniu:\n\n";
    for (i = 0; i < N; i++) cout << setw(4) << d[i];
    cout << endl;
    return 0;
}
2

Masz nie losować liczby lecz wczytać je ze strumienia wejściowego cin
Oprócz tego wg zadanie ma być sortowanie przez scalanie.

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