【发布时间】:2020-08-04 16:48:04
【问题描述】:
我需要按升序对文件中的整数进行排序并将它们打印到标准输出。我无法修改文件的结构。
txt 文件如下所示:
41
65
68
35
51
...(连续一个数字)
我的程序适用于小文件,但我必须使用 malloc 为较大的文件(如 300 万个数字)优化它,但不知道确切的位置和方式。我想在这方面寻求帮助。 (我是初学者)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER 100000
int sort(int size, int arr[])
{
for (int i = 0; i < size - 1; i++)
{
for (int j = 0; j < size - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int swap = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = swap;
}
}
}
}
int main(int argc, char *argv[])
{
char *filename = argv[1];
char s[20];
if (argc == 1)
{
fprintf(stderr, "Error! Input then name of a .txt file\n");
exit(1);
}
FILE *fp = fopen(filename, "r");
if (fp == NULL)
{
fprintf(stderr, "Error! Can't open %s\n", filename);
exit(1);
}
int arr[BUFFER];
int i = 0;
int size = 0;
while ((fgets(s, BUFFER, fp)) != NULL)
{
s[strlen(s) - 1] = '\0';
arr[i] = atoi(s);
++i;
++size;
}
fclose(fp);
sort(size, arr);
for (int i = 0; i < size; ++i)
{
printf("%d\n", arr[i]);
}
return 0;
}
【问题讨论】:
-
如果您要对 300 万个数字进行冒泡排序,您需要担心的不仅仅是如何存储它们,同时对它们进行排序。菜单上可能有更好的排序算法。无论如何,让
arr动态,理想地匹配项目的数量,如果你真的想变得花哨,随着你阅读越来越多的数字而变得广阔。请参阅有关动态内存管理的课程文本。 -
使用基数排序而不是冒泡排序