计算C中的整数排序列表

时间:2014-11-11 02:20:54

标签: c sorting integer counting

我正在尝试创建一个程序,它将对一个随机生成的整数列表进行排序。我想生成一个说3000个整数的列表,取一半并排序。然后我想获取我刚刚排序的排序整数并将它们保存到临时文件中。然后我想取另一半的整数并对它们进行排序并将它们保存到不同的临时文件中。一旦两个部分都被排序,我想将两个临时文件合并到一个文件中。

我的问题是如何生成随机3000整数并将它们保存到临时文件中,然后将它们调用到我的计数排序函数中?

以下是我的一些代码。

#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 :(得分:2)

array_1array_2生成文件非常简单。您也可以使用max运算符将生成的数字的% modulo值限制为您喜欢的任何值。以下是一个小例子,其中包含解释该方法的注释。以下例程将提示用户在两个文件之间分割的元素总数。 (如果奇数,第二个数组将比第一个更大)。在您的情况下,输入3000将导致创建两个1500个元素的数组,每个元素的值1 - 10000保存在当前工作的array_1.txtarray_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