2014-11-11 6 views
-1

Я пытаюсь создать программу, которая будет подсчитывать Сортировка случайно сгенерированного списка целых чисел. Я хочу создать список из 3000 целых чисел, взять половину из них и отсортировать. Затем я хочу взять отсортированные целые числа, которые я только что отсортировал, и сохранить их во временном файле. Затем я хочу взять другую половину целых чисел и отсортировать их и сохранить их в другом временном файле. Как только обе половины отсортированы, я хочу объединить оба временных файла в один файл.Подсчет списка сортировки целых чисел в C

Мой вопрос заключается в том, как я могу сгенерировать случайные целые числа 3000 и сохранить их во временном файле, а затем вызвать их в функцию сортировки counting?

Вот некоторые из моих кодов.

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

void counting_sort_mm(int *array, int n, int min, int max) 
{ 
    int i, j, z; 

    int range = max - min + 1; 
    int *count = malloc(range * sizeof(*array)); 

    for(i = 0; i < range; i++) count[i] = 0; 
    for(i = 0; i < n; i++) count[ array[i] - min ]++; 

    for(i = min, z = 0; i <= max; i++) 
    { 
    for(j = 0; j < count[i - min]; j++) 
    { 
     array[z++] = i; 
    } 
    } 

    free(count); 
} 

void counting_sort(int *array, int n) 
{ 
    int i, min, max; 

    min = max = array[0]; 
    for(i=1; i < n; i++) 
    { 
    if (array[i] < min) 
    { 
     min = array[i]; 
    } else if (array[i] > max) 
    { 
     max = array[i]; 
    } 
    } 
} 

Мой Генератор случайных (до сих пор не уверен, как сохранить их в двух различных временных файлов ..)

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

int main() { 
    int c, n; 

    for (c = 1; c <= 3000; c++) { 
    n = rand()%100 + 1; 
    printf("%d\n", n); 
    } 

    return 0; 
} 
+1

вы знаете диапазон случайных чисел? –

+0

Я просто хочу от 0 до 3000 целых чисел размером не более 10 000 – Derk

+2

Я не дал вам этого -1, но в отличие от человека, который сделал это, я думаю, что могу объяснить, почему это произошло, derk. По этому вопросу мы действительно хотим видеть код, который вы пытаетесь записать, чтобы генерировать случайные числа, код сортировки является касательным. Соблюдайте свой вопрос, и это пример кода, ориентированного на проблему, и здесь вы получите лучшие результаты. Начните с написания кода, который вызывает rand(). – Segfault

ответ

2

Генерация файлов для array_1 и array_2 довольно прямо вперед. Вы также можете ограничить значения max для чисел, сгенерированных по вашему желанию, с помощью оператора % modulo. Ниже приведен небольшой пример с комментариями, объясняющими подход. Следующая процедура подскажет пользователю об общем количестве элементов для разделения между двумя файлами. (если нечетно, второй массив будет больше, чем первый). В вашем случае ввод 3000 приведет к созданию двух массивов из 1500 элементов со значениями между 1 - 10000, сохраненными в array_1.txt и array_2.txt в текущем рабочем каталоге.

Вы можете изменить диапазон чисел, сгенерированных простым, изменив определение #define AMAX 10000 в начале. Допустимый диапазон: 0 - INT_MAX. Дайте знать, если у вас появятся вопросы. Начало второй вопрос, когда вы дойдете до mergesort части задачи:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <unistd.h> 
#include <limits.h> 

#define AMAX 10000 

int main() { 

    int n = 0;    /* total number of elements for arrays */ 
    int *array_1 = NULL; /* array to hold 1/2 total elements  */ 
    int *array_2 = NULL; /* array to hold 1/2 total elements  */ 
    int sz_1 = 0;   /* size of array_1 array (1/2 * n)  */ 
    int sz_2 = 0;   /* size of array_2 (n - sz_1) +1 if odd */ 
    int i = 0;    /* general iterator      */ 
    FILE *ofp = NULL;  /* file stream pointer     */ 

    printf ("\nEnter the total number of elements to be split between 2 arrays : "); 
    scanf ("%d", &n); 

    sz_1 = n/2;         /* compute sz_1       */ 
    sz_2 = n - sz_1;        /* compute sz_2 (handle odd 'n')  */ 

    array_1 = calloc (sz_1, sizeof (int));   /* allocate mem for array_1 init to 0 */ 
    array_2 = calloc (sz_2, sizeof (int));   /* allocate mem for array_2 init to 0 */ 

    srand (time(NULL));        /* seed psuedo-random number sequence */ 

    if (!(ofp = fopen ("array_1.txt", "w")))  /* open file for array_1 values   */ 
    { 
     fprintf (stderr, "error: failed to open output file 'array_1.txt'\n"); 
     exit (EXIT_FAILURE); 
    } 

    for (i = 0; i < sz_1; i++)      /* fill array_1 with random values  */ 
    { 
     array_1[i] = (rand() % AMAX) + 1;   /* semi-random No. between 1 - AMAX  */ 
     fprintf (ofp, "%d\n", array_1[i]);   /* write to file array_1.txt   */ 
    } 

    fclose (ofp);         /* close array_1 file stream   */ 

    if (!(ofp = fopen ("array_2.txt", "w")))  /* open file for array_2 values   */ 
    { 
     fprintf (stderr, "error: failed to open output file 'array_2.txt'\n"); 
     exit (EXIT_FAILURE); 
    } 

    for (i = 0; i < sz_2; i++)      /* fill array_2 with random values  */ 
    { 
     array_2[i] = (rand() % AMAX) + 1;   /* semi-random No. between 1 - AMAX  */ 
     fprintf (ofp, "%d\n", array_2[i]);   /* write to file array_2.txt   */ 
    } 

    fclose (ofp);         /* close array_2 file stream   */ 

    /* do what ever else you need to do with array_1/array_2 (you can sort before save)*/ 

    if (array_1) free (array_1);     /* free memory allocated to array  */ 
    if (array_2) free (array_2); 

    return 0; 
} 

Пример - использование и вывод:

$ ./bin/tworanda 

Enter the total number of elements to be split between 2 arrays : 20 

$ cat array_1.txt 
4585 
3295 
4702 
2030 
5816 
6157 
7130 
6913 
3285 
5811 

$ cat array_2.txt 
9926 
8967 
1103 
5704 
3964 
207 
8460 
8387 
2665 
8094 
Смежные вопросы