【问题标题】:c sorting large struct array and printing to screenc对大型结构数组进行排序并打印到屏幕
【发布时间】: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 &lt; MAX; i++ )...。验证您的算法是否有效(或不)首先使用小样本集。
  • 另外,请意识到将 150000 行打印到标准输出确实会给您的控制台带来问题。 (如果将输出重定向到文件,您会发现输出速度要快得多。)
  • @Chrislast:您遇到的具体问题是冒泡排序(您使用的算法)的执行时间为 O(n^2);也就是说,运行所花费的时间与要排序的项目数的平方成正比。 15万平方是225亿;即使在现代处理器上,使用该算法对这么多记录进行排序也需要几秒钟以上的时间。

标签: c arrays sorting struct structure


【解决方案1】:

对于排序,你应该使用 qsort 函数而不是重新发明轮子。

#include <stdlib.h>

int my_compar(const void *a, const void *b) {
  const struct RandStruct *aa = a;
  const struct RandStruct *bb = b;
  if(aa->year < bb->year) return -1;
  if(aa->year == bb->year) return 0;
  return 1;
}

int main(void) {
   ... other stuff ...
   size_t size = sizeof(struct RandStruct);
   qsort(randArray, sizeof(randArray)/size, size, my_compar);
}

【讨论】:

  • 收听@Random832。他是你的大师!
  • my_compar 的参数必须是 const
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 2014-03-12
  • 2016-07-14
  • 2014-05-21
相关资源
最近更新 更多