【发布时间】:2013-12-03 20:28:16
【问题描述】:
我无法对结构数组进行排序,然后将其打印到屏幕上。当我在 Visual Studio 2012 中运行代码时,它根本不打印。我花了好几个小时才弄清楚,调试模式非常错误。我真的需要知道为什么它没有按照我说的去做。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
struct RandStruct
{
int year;
char string[31];
int frequency;
};
struct RandStruct randArray[150000];
int main(void)
{
int i, j;
for (i = 0; i < 150000; i++)
{
randArray[i].year = 150000 - i;
strcpy(randArray[i].string, "test");
randArray[i].frequency = i;
}
for (i = 1; i < 150000; i++)
{
for (j = 0; j < 150000 - i; j++)
{
if (randArray[j].year > randArray[j+1].year)
{
struct RandStruct temp = randArray[j];
randArray[j] = randArray[j+1];
randArray[j+1] = temp;
}
}
}
for (i = 0; i < 150000; i++)
{
printf("%d,%s,%d\n", randArray[i].year, randArray[i].string, randArray[i].frequency);
}
return 0;
}
【问题讨论】:
-
如果您在调试器中运行并中断,您是否还在嵌套的 for 循环中?您的排序循环将运行 225 亿次。
-
@Chrislast 只是需要很长时间,因为冒泡排序在这种大小上很慢。
-
是的,首先将您的计数器减少几个数量级,一直到 15。然后使用符号常量而不是文字(即
#define MAX 15 ... for ( i = 0; i < MAX; i++ )...。验证您的算法是否有效(或不)首先使用小样本集。 -
另外,请意识到将 150000 行打印到标准输出确实会给您的控制台带来问题。 (如果将输出重定向到文件,您会发现输出速度要快得多。)
-
@Chrislast:您遇到的具体问题是冒泡排序(您使用的算法)的执行时间为 O(n^2);也就是说,运行所花费的时间与要排序的项目数的平方成正比。 15万平方是225亿;即使在现代处理器上,使用该算法对这么多记录进行排序也需要几秒钟以上的时间。
标签: c arrays sorting struct structure