Сложность выполнения в C - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть задача подсчитать шаги сортировки и сортировки.Я реализовал переменную подсчета как z, и она хранится в указателе * befehle.

Моя проблема в том, что я просто не могу понять, как правильно вызывать функции.И программа всегда говорит мне, что результат сортировки счетчиков и сортировки вставок различен.

Выходные данные представляют собой диаграмму с указанием количества шагов, которые потребовались для каждого n и сколько времени на это ушло.

Я не совсем понимаю, сколько вам нужно увидеть, чтобы помочь мне, поэтому я просто публикую полный код.

Меня беспокоит в основном функция void count_sort.

#include <stdio.h>
#include <stdlib.h>
#include "introprog_complexity_steps_input.h"

const int MAX_VALUE = 5000000;

void count_sort_calculate_counts(int input_array[], int len, int count_array[], int* befehle) {
       //muss implementiert werden
                                            int z = 0;
                                            z=z+1; //für x
                                            z=z+1; //für j

    for (int x=0;x<=MAX_VALUE;x++){
        count_array[x] = 0;
                                            z=z+1; //Vergleich d. Schleife
                                            z=z+1; //Inkrementierung der Schleife

    }

    for (int j = 0; j<len; j++){
                                            z=z+1; // Vergleich
                                            z=z+1; // Inkrementierung d. Schleife
        count_array[input_array[j]]++;
                                            z=z+1; //Inkrementierung
    }
                                            *befehle = z;
}

void count_sort_write_output_array(int output_array[], int len, int count_array[], int* befehle) {
    //muss implementiert werden
                                            int z = 0;
                                            z=z+1; //Allozierung v. Speicher in Count_Sort
                                            z=z+1; //Für k
                                            z=z+1; //Zuweisung v. j
                                            z=z+1; //Zuweisung v. i

    int k = 0;
    for (int j = 0;j <=len;j++){
                                            z=z+1; //Vergleich d. Schleife
                                            z=z+1; //Inkrementierung d. Schleife
        for(int i = 0; i<count_array[j]; i++){
                                            z=z+1; // Vergleich d. Schleife
                                            z=z+1; //Inkrementierung d. Schleife

            output_array[k] = j;

                                            z=z+1; // Zuweisung
                                            z=z+1; // Inkrementierung v. k

            k=k+1;
        }
    }
                                            *befehle=z;
}


void count_sort(int array[], int len, int* befehle) {

    int* count_array = malloc(sizeof(int) * MAX_VALUE);

    int input_array[len];
    int output_array[len];



    count_sort_calculate_counts(input_array, len, count_array, befehle);
    count_sort_write_output_array(output_array, len, count_array, befehle);
    free(count_array);
}


void insertion_sort(int array[], int len, int* befehle) {
    //muss implementiert werden
    int z=0;
    int j, i, key;
                                            z=z+1; // j Zuweisung
    for (j=1; j<len; j++) {
                                            z=z+1; // Vergleich
                                            z=z+1; // Inkrementierung v. j
        key = array[j];
                                            z=z+1; // Zuweisung
        i=j-1;
                                            z=z+1; //Inkrementierung

        while (i>=0 && array[i] > key) {
                                            z=z+1; //Vergleich 1
                                            //z=z+1; //Vergleich 2
            array[i+1] = array[i];
                                            z=z+1; //Zuweisung
            i = i-1;
                                            z=z+1; //Inkrementierung
        }
        array[i+1] = key;
                                            z=z+1; //Zuweisung
    }
                                            *befehle=z;
}


int main(int argc, char *argv[]) {

    const int WERTE[] = {1000,2000,3000,4000,5000};
    const int LEN_WERTE = 5;
    const int LEN_ALGORITHMEN = 2;

    int rc = 0;
    long befehle_array[LEN_ALGORITHMEN][LEN_WERTE];
    double laufzeit_array[LEN_ALGORITHMEN][LEN_WERTE];

    for(int j = 0; j < LEN_WERTE; ++j)
    {
        int n = WERTE[j];

        //reserviere Speicher für  Arrays der Länge n
        int* array_countsort = malloc(sizeof(int) * n);
        int* array_insertionsort = malloc(sizeof(int) * n);

        //fülle array_countsort mit Zufallswerten ..
        fill_array_randomly(array_countsort, n, MAX_VALUE);
        //.. und kopiere die erzeugten Werte in das Array array_insertionsort
        copy_array_elements(array_insertionsort, array_countsort, n);

        //teste ob beide Arrays auch wirklich die gleichen Werte enthalten
        if(!check_equality_of_arrays(array_countsort, array_insertionsort, n))
        {
            printf("Die Eingaben für beide Algorithmen müssen für die Vergleichbarkeit gleich sein!\n");
            return -1;
        }

        for(int i = 0; i < LEN_ALGORITHMEN; ++i)
        {
            int anzahl_befehle = 0;

            start_timer();

            //Aufruf der entsprechenden Sortieralgorithmen
            if(i==0)
            {
                    count_sort(array_countsort, n, &anzahl_befehle);
            }
            else if(i==1)
            {
                    insertion_sort(array_insertionsort, n, &anzahl_befehle);
            }

            //speichere die Laufzeit sowie die Anzahl benötigter Befehle
            laufzeit_array[i][j] = end_timer();
            befehle_array[i][j] = anzahl_befehle;
        }

        //teste ob die Ausgabe beider Algorithmen gleich ist
        if(!check_equality_of_arrays(array_countsort, array_insertionsort, n))
        {
            printf("Die Arrays sind nicht gleich. Eines muss (falsch) sortiert worden sein!\n");
            rc = -1;
        }

        //gib den Speicherplatz wieder frei
        free(array_countsort);
        free(array_insertionsort);
    }

    //Ausgabe der Anzahl ausgeführter Befehle sowie der gemessenen Laufzeiten (in Millisekunden)
    printf("Parameter MAX_VALUE hat den Wert %d\n", MAX_VALUE);
    printf("\t %32s           %32s \n", "Countsort","Insertionsort");
    printf("%8s \t %16s %16s \t %16s %16s \n", "n","Befehle", "Laufzeit","Befehle","Laufzeit");

    for(int j = 0; j < LEN_WERTE; ++j)
    {
        printf("%8d \t ",WERTE[j]);
        for(int i = 0; i < LEN_ALGORITHMEN; ++i)
        {
            printf("%16ld %16.4f \t ",  befehle_array[i][j], laufzeit_array[i][j]);
        }
        printf("\n");
    }

    return rc;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...