Sortowanie Min Max

0

Witam. Do napisania mam program sortujący. Najpierw tworzy tablice o podanym rozmiarze, następnie wypełnia ją tab[0]=0, tab[1]=1, miesza ją i sortuje. Sortowanie takiej tablicy ma się wykonać 5 razy, żeby policzyć średnią arytmetyczną pojedynczego sortowania. Potem rozmiar zwiększa się i tablica znowu jest wypełniana itd..
Sortowanie ma wyszukiwać minimalną i maksymalną wartość z tablicy, wstawiać je jako pierwszy(min), i ostatni element(max), a następnie "ucinać" tą tablice na końcu i początku i rekurencyjnie powtarzać to dla zmniejszonej tablicy.
p jest to minimalny indeks, k jest to maksymalny indeks tablicy. Niestety nie mogę znaleźć błędu.. Tutaj kod:

#include<iostream>
#include<cstdio>
#include<time.h>
#include<ctime>
#include<algorithm>
#include<fstream>

FILE *plik;

void sortowanieminmax_(int *tab, int rozmiar, int p, int k)

{
    int max, min, j, pom;
    for (int i = 0; i < rozmiar; i++)
    {
        std::cout << tab[i] << "\n";
    }
    system("pause");
    if (k - p >= 0)
    {
        max = p;
        min = p;
        for (j = p; j < k + 1; j++)
        {
            if (tab[j] < tab[min])
            {
                min = j;
            }
            if (tab[j]>tab[max])
            {
                max = j;
            }
        }
        pom = tab[p];
        tab[p] = tab[min];
        tab[min] = pom;
        pom = tab[k];
        tab[k] = tab[max];
        tab[max] = pom;
        p = p + 1;
        k = k - 1;
        sortowanieminmax_(tab, rozmiar, p, k);
    }

}
void sortowanieminmax(int* tab, int rozmiar, double TabPom[])
{
    int w, i, sprawdzanie, z;
    clock_t start, koniec;
    double srednia;

    printf("Sortowanie min-max:\n");
    fprintf(plik, "Sortowanie min-max:\n");
    for (w = 0; w < 8; w++) // tworzenie tablic
    {
        rozmiar = rozmiar + rozmiar;
        tab = (int*)malloc(sizeof(int)*rozmiar);

        for (i = 0; i < rozmiar; i++) // wypelnianie tablicy tab[1]=1 itd...
        {
            tab[i] = i;
        }
        for (z = 0; z < 5; z++) // petla do mieszania i sortowania 5 razy zeby policzyc srednia arytmetyczna
        {
            std::random_shuffle(tab, tab + rozmiar);
            start = clock(); // zaczyna mierzyc czas
            /// sortowanie MIN_MAX

            sortowanieminmax_(tab, rozmiar, 0, rozmiar - 1);

            /// sortowanie MIN_MAX
            koniec = clock(); //konczy mierzyc czas
            TabPom[z] = koniec - start;
            for (sprawdzanie = 0; sprawdzanie < rozmiar - 1; sprawdzanie++)
            {
                if (tab[sprawdzanie] > tab[sprawdzanie + 1])
                {
                    printf("Zle\n");
                    break;
                }
            }
        }
        srednia = (TabPom[0] + TabPom[1] + TabPom[2] + TabPom[3] + TabPom[4]) / 5;
        printf("Dla tablicy %d elementowej zajelo to srednio %f sekund.\n", rozmiar, ((float)srednia) / CLOCKS_PER_SEC); // srednia arytm. 5 sortowan dla 1 tablicy
        fprintf(plik, "Dla tablicy %d elementowej zajelo to srednio %f sekund.\n", rozmiar, ((float)srednia) / CLOCKS_PER_SEC);
        free(tab);
    }
}

int main()
{
    plik = fopen("wyniki.txt", "a");
    int rozmiar = 5;
    double TabPom[5];
    int *tab = NULL;
    sortowanieminmax(tab, rozmiar, TabPom);
    fclose(plik);
    return 0;
} 
0

Problem udało mi się rozwiązać dzięki dodaniu kilku warunków:

void sortowanieminmax_(int *tab, int rozmiar, int p, int k)

{
    int max, min, j, pom;
    if (k - p >= 0)
    {
        max = p;
        min = p;
        for (j = p; j < k + 1; j++)
        {
            if (tab[j] < tab[min])
            {
                min = j;
            }
            if (tab[j]>tab[max])
            {
                max = j;
            }
        }
        if (max == p && min == k)
        {
            pom = tab[max];
            tab[max] = tab[min];
            tab[min] = pom;
        }
        else if (max == p)
        {
            pom = tab[k];
            tab[k] = tab[max];
            tab[max] = pom;
            pom = tab[p];
            tab[p] = tab[min];
            tab[min] = pom;
        }
        else
        {
            pom = tab[p];
            tab[p] = tab[min];
            tab[min] = pom;
            pom = tab[k];
            tab[k] = tab[max];
            tab[max] = pom;
        }
        p = p + 1;
        k = k - 1;
        sortowanieminmax_(tab, rozmiar, p, k);
    }
}

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