我们今天来学习一个把数组元素打印成柱形图的技巧,结果如下:
005
004 ###
003 ### ###
002 ### ### ###
001 ### ### ### ###
jack@alchemy:~/C$
思考过程
如果我们把一个数组的每个元素用柱形图的方式打印出来,里面的各个元素是
1, 2, 3, 4, 5
我们有一个平面直角坐标系,那么、坐标系里面的某个点的纵坐标意义就是这个点在某条垂直于y轴的直线上
一图胜千言:
所以,我们可以用一个循环来表示y轴
for (int i = 20; i > 0; --i)
这个东西看起来就像是一个长度只有20个长度的y轴
当我们的数据大于等于这个y轴坐标的时候,我们的柱形图就应该“存在”了。(这里我找不到更好的表述)
下面我们来看
代码
int print_array(int *array, int size)
{
system("clear");
for (int i = 20; i > 0; --i) { // 外循环是y轴
for (int j = 0; j < size; j++) { // 遍历访问每一个数组元素
// 如果数组元素大于或者等于当前y轴坐标
if (array[j] == i)
{
printf("%03d", i);
}
else if (array[j] > i){
printf("###");
}
else
printf(" ");
// 处理完一个元素之后,打印一个空格来隔开。
printf(" ");
}
putchar('\n');
}
return 0;
}
执行结果
005
004 ###
003 ### ###
002 ### ### ###
001 ### ### ### ###
jack@alchemy:~/C$
结合排序算法
结合冒泡排序算法
在每一次交换之后,我们进行一次屏幕的清空(windows下面可以用CLS命令, linux下面可以用clear命令),然后再进行数组的打印。
代码
int bubble_print(int *a, int size)
{
int i = 0, j = 0;
int changed = 0;
for (i = 0; i < size-1; ++i) // i表示着倒数第几个位置成为最大(小)值,
{
changed = 0;
for(j = 0; j < size-i; ++j) // 因为i这个计数是从0开始的,i的最大值小于数据长度-1,j就能走到倒数数据长度-1个位置, 也就是j能走到正数第二个位置
// 随着i的值的变大,j走的范围在减小
{
if (a[j] > a[j+1]) // 这里我们想要一个升序的结果,如果前面的比后面的大,就交换数据
{
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
changed = 1;
}
print_array(a, size); // 在这里进行了打印
usleep(300000);
}
if (!changed) {
break;
}
}
return 0;
}
效果
请读者自己去尝试一下快排的演示
这里是快排效果
总结
流程控制其实就可以控制很多自然的东西。 编程虽然是数学计算,但不仅仅是数学计算