所以我正在构建一个项目,创建一个代表冒泡排序算法的图,但是,我所做的方法非常慢,并且像重新组织具有一百个位置的向量需要大约 3 分钟。这是实现:
void bubbleSort(int vet[]) { // Implementation of the bubble sort algorithm
int i, aux, troca;
do {
troca = 0;,
for (i = 0; i < VET_SIZE - 1; i++) {
createGraphic(vet);
if (vet[i] > vet[i+1]) {
aux = vet[i];
vet[i] = vet[i+1];
vet[i+1] = aux;
troca = 1;
}
}
} while (troca);
}
void createGraphic(int vet[]) { // Drawing the graphic
char graphic[VET_SIZE * (VET_SIZE * GRAPHIC_LENGHT + 1) + 1];
int i, j, k;
system("cls");
for (i = 0; i < VET_SIZE; i++) {
for (j = 0; j < VET_SIZE; j++) {
if (vet[j] - i > 0) {
graphic[i * (VET_SIZE * GRAPHIC_LENGHT + 1) + j * GRAPHIC_LENGHT] = '#';
for(k = 1; k <= GRAPHIC_LENGHT + 1; k++) { // Depending of the value of GRAPHIC LENGHT this part of the code print ' ' to give some spaces between he bars
graphic[i * (VET_SIZE * GRAPHIC_LENGHT + 1) + j * GRAPHIC_LENGHT + k] = ' ';
}
} else {
graphic[i * (VET_SIZE * GRAPHIC_LENGHT + 1) + j * GRAPHIC_LENGHT] = ' ';
for(k = 1; k <= GRAPHIC_LENGHT + 1; k++) {
graphic[i * (VET_SIZE * GRAPHIC_LENGHT + 1) + j * GRAPHIC_LENGHT + k] = ' ';
}
}
}
graphic[i * (VET_SIZE * GRAPHIC_LENGHT + 1) + VET_SIZE * GRAPHIC_LENGHT] = '\n';
}
graphic[VET_SIZE * (VET_SIZE * GRAPHIC_LENGHT + 1)] = '\0';
printf(GREEN "%s", graphic);
}
首先,我尝试仅逐个字符地打印图形,但我发现它非常慢,然后我将图形放入矢量中并将所有内容打印在一起,这有点快,但仍然不是我想要的。有人可以帮我调整一些工具或代码,使图形立即显示或比当前实现更快吗?
首先可以解决的问题是:
使数组“图形”非VLA(大小在编译时已知),并使其全局或静态。
如果您还没有这样做,请使用 -O2 进行编译。
不要使用“系统”函数 - 将这 3 个字节放在数组的开头 - “c”。它有效地执行相同的操作(如果您使用 gnu/linux),但没有“系统”调用的开销。 “系统”调用基本上是在下面调用 fork - 每次迭代都这样做并不是一个好主意。
摆脱 printf 并使用“write”系统调用直接输出缓冲区。可能不是那么有效,但值得一试。
但最有效的方法当然是重新考虑算法。
还有,那个逗号是怎么回事?
troca = 0;,